2012-01-24 4 views
4

У меня есть TextView, который я назначенную как в onTouchListener и onClickListener:Android TextView NullPointerException с onTouchListener и onClickListener на 4.0

myTextView.setOnTouchListener(new OnTouchListener() { 
    public boolean onTouch(View v, MotionEvent event) { 
     _gestureDetector.onTouchEvent(event); 
     return false; 
    } 
}); 

myTextView.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 
     // Show Toast Notification 
    } 
}); 

onTouchListener обнаружит onFling() для детектора жеста. Этот код работает без каких-либо проблем. EXCEPT для Android 4.0 (сэндвич с мороженым). С 4.0 я получаю исключение NullPointerException в «_gestureDetector.onTouchEvent (событие)»; (когда я пытаюсь бросить).

Если я комментирую onClickListener, однако, fling будет работать, и я не получу исключение NullPointerException.

Я был в предположении, что если оба сенсорных прослушивателя вернутся с ошибкой, событие не будет потреблено, что позволит им работать.

У кого-нибудь есть идеи? Благодаря!

Вот больше моего кода:

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.calendar); 


    _gestureDetector = new GestureDetector(new GestureListener()); 

} 

private class GestureListener extends SimpleOnGestureListener { 
    @Override 
    public boolean onDown(MotionEvent e) { 
     return false; 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, 
      float velocityY) { 

     if (e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE 
       && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) { 
      // Bottom to top 

      _calendarTableLayout.removeAllViews(); 

      int month = _calendar.get(Calendar.MONTH); 

      _calendar.set(Calendar.MONTH, month + 1); 
      _calendar.set(Calendar.DATE, 1); // important 

      drawCalendar(); 

      return true; 
     } else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE 
       && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) { 
      // Top to bottom 

      _calendarTableLayout.removeAllViews(); 

      int month = _calendar.get(Calendar.MONTH); 

      _calendar.set(Calendar.MONTH, month - 1); 
      _calendar.set(Calendar.DATE, 1); // important 

      redrawCalendar(); 

      return true; 
     } 

     return false; 
    } 

    @Override 
    public void onLongPress(MotionEvent e) { 
     // Do nothing 
    } 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, 
      float distanceX, float distanceY) { 
     // Do nothing 
     return false; 
    } 

    @Override 
    public void onShowPress(MotionEvent e) { 
     // Do nothing 
    } 

    @Override 
    public boolean onSingleTapUp(MotionEvent e) { 
     // Do nothing 
     return false; 
    } 
} 

StackTrace:

01-27 11:12:16.406: E/AndroidRuntime(1448): FATAL EXCEPTION: main 
01-27 11:12:16.406: E/AndroidRuntime(1448): java.lang.NullPointerException 
01-27 11:12:16.406: E/AndroidRuntime(1448): at  android.view.GestureDetector.onTouchEvent(GestureDetector.java:587) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at  com.my.package.MyActivity$9.onTouch(MyActivity.java:287) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at  android.view.View.dispatchTouchEvent(View.java:5481) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at  android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at  android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at  android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at  android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at  android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:1959) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1728) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1892) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1371) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at android.app.Activity.dispatchTouchEvent(Activity.java:2364) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at  com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:  1840) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at android.view.View.dispatchPointerEvent(View.java:5662) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:2863) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at android.os.Looper.loop(Looper.java:137) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at android.app.ActivityThread.main(ActivityThread.java:4340) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at java.lang.reflect.Method.invokeNative(Native Method) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at java.lang.reflect.Method.invoke(Method.java:511) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at  com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at  com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
01-27 11:12:16.406: E/AndroidRuntime(1448): at dalvik.system.NativeStart.main(Native Method) 
+0

Я никогда не использовал детектор жестов. поэтому я не могу быть очень полезным, в любом случае ... NullPointerException, потому что _gestureDetector имеет значение null? – kingston

+0

Нет, _gestureDetector не равно нулю. Согласно трассировке стека, исключение NullPointerException происходит из android.view.GestureDetector.onTouchEvent (GestureDetector.java:587) – littleK

+0

Любая вероятность того, что вы построили детектор жестов с нулевым OnGestureListener? –

ответ

3

Мой друг, попытаться вернуться верно, когда вы получаете события, которые вы хотите обработать с _gestureDetector:

public boolean onTouch(View v, MotionEvent event) { 
    if (_gestureDetector.onTouchEvent(event)) { 
     return true; 
    } 
    return false; 
} 

В противном случае, возвращающих ложь.

+0

Это кажется чтобы исправить это, спасибо! – littleK

+2

У меня такая же проблема, и этот ответ ее не решает :( –

0

Я посмотрел на источник Android (4.0.1 r1) для GestureDetector: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/android/view/GestureDetector.java?av=f

Строка 587 не похожа на источник проблемы, так как mVelocityTracker всегда инициализируется этой точкой. Любая идея, которая построила 4.0 у вас?

Это может быть ошибка в 4.0, и я хотел бы подать отчет об ошибке им об этом здесь:

http://code.google.com/p/android/issues/list

В то же время, это возможно для вас переместить код в ваш OnClickListener в метод OnSingleTapConfirmed для SimpleGestureListener? Таким образом, он все равно должен поступать правильно, как если бы ваш прослушиватель кликов был прокомментирован, но вы получите то же поведение.

http://developer.android.com/reference/android/view/GestureDetector.SimpleOnGestureListener.html#onSingleTapConfirmed(android.view.MotionEvent)

+0

Привет, redneckjedi, я вижу проблему на Galaxy Nexus с 4.0.2. Спасибо за вашу помощь. – littleK

+0

Кроме того, я просматривал GestureDetector.java и при отладке исключения NullPointerException в моем приложении mVelocityTracker показывает как null ... – littleK

+0

Даже когда я комментирую мои onClickListeners, и я помещаю точку останова в _gestureDetector, mVelocityTracker показывает как null, хотя исключение NullPointerException не выбрасывается (поскольку я не испытываю проблемы при комментировании onClickListener) – littleK

 Смежные вопросы

  • Нет связанных вопросов^_^