Android TextView NullPointerException con onTouchListener y onClickListener en 4.0

Tengo un TextView que he asignado un onTouchListener y un onClickListener:

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 } }); 

El onTouchListener detectará un onFling () para el detector de gestos. Este código funciona sin ningún problema EXCEPTO para Android 4.0 (sandwich de helado). Con 4.0, recibo una NullPointerException en "_gestureDetector.onTouchEvent (event);" (Cuando trato de lanzar).

Si comento el onClickListener, sin embargo, el fling funcionará y no recibiré una NullPointerException.

Yo estaba bajo la suposición de que si el oyente táctil devuelve false, el evento no se consumiría, permitiendo que ambos funcionaran.

¿Alguien tiene alguna idea? ¡Gracias!

Aquí hay más de mi código:

  /** 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) 

Mi amigo, trate de devolver true cuando obtenga los eventos que desea manejar desde _gestureDetector:

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

De lo contrario, devuelva false.

He echado un vistazo a la fuente de Android (4.0.1 r1) para GestureDetector: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/android /view/GestureDetector.java?av=f

La línea 587 no parece que podría ser la fuente del problema, ya que mVelocityTracker siempre se inicializa por ese punto. ¿Alguna idea de qué versión de 4.0 tienes?

Esto puede ser un error en 4.0, y me gustaría presentar un informe de error a ellos acerca de él aquí:

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

Mientras tanto, ¿es posible mover el código en su OnClickListener al método OnSingleTapConfirmed de SimpleGestureListener? De esa manera, todavía debe hacer lo correcto como si su oyente de clics se comentó, pero obtiene el mismo comportamiento.

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

  • Utilizar ColorMatrix o HexColor en BlendModeFilter - Android?
  • Android cómo leer el código Java obfuscated después de conseguir a través de la ingeniería inversa
  • Cómo obtener una fecha con formato en milisegundos?
  • Java.lang.ClassCastException: android.widget.LinearLayout no se puede convertir en android.widget.ListView
  • Diferencia entre ActionBarSherlock y ActionBar Compatibilidad
  • Obtener foto de perfil de facebook y establecer en imageview
  • Solución Java (framework / library / API) para aplicaciones / aplicaciones reales de crossplatform
  • Juegos de sincronización de Java: sincronizados && wait && notify
  • Cambio de Android Color de sombra de elevación de material
  • Error al crear la propia biblioteca de tarro para el proyecto de Android
  • No se invoca el método Java cuando se llama desde pthread nativo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.