Bloqueo de onClick de Android enFling

Tengo una Actividad que implementa un Detector de Gestos para capturar la entrada de fling del usuario para navegar a otras pantallas. Eso estaba funcionando bien – pero – He actualizado recientemente una clase que deriva de BaseActivity para agregar una función onClick y ahora que el evento click parece bloquear el onFling de ser golpeado. El onClick está vinculado a un área TextView (en un LinearLayout) que tengo en mi pantalla. El método resultsClick se conecta al TextView utilizando su propiedad onClick en el diseño XML.

He intentado cambiar los valores de retorno en onSingleTapUp y onDown sin suerte. También he intentado agregar declaraciones de registro a todas las funciones abajo también. Ninguno de ellos se dispara cuando invoco el área de TextView, pero lo hacen en otras áreas de la pantalla.

Tal vez estoy usando los términos de búsqueda equivocada, pero no pude encontrar un ejemplo que abordó esto – pero estoy seguro de que este problema se ha resuelto antes.

public class DerivedActivity extends BaseActivity { ... /** * resultsClick - The user clicked on the Results area * @param v */ public void resultsClick(View v) { try { Log.i(this.toString(), "resultsClick"); startActivity(new Intent(this, Results_TabHost.class )); } catch (Exception e) { Log.e(this.toString(), "Exception" + e.toString()); } }// end resultsClick ... } 

Esta es la clase base que implementa el código GestureListener

 public class BaseActivity extends ActivityGroup implements OnGestureListener { ... private static final int SWIPE_MIN_DISTANCE = 120; private static final int SWIPE_MAX_OFF_PATH = 250; private static final int SWIPE_THRESHOLD_VELOCITY = 200; public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { try { Log.i(this.toString(), "onFling"); // jump right out if not a swipe/fling if (Math.abs( e1.getY() - e2.getY() ) > SWIPE_MAX_OFF_PATH) { return false; } // right to left swipe if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY ) { Log.i(this.toString(), "fling left"); rightArrowClick(null); } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY ) { Log.i(this.toString(), "fling right"); leftArrowClick(null); } } catch (Exception e) { Log.e(this.toString(), "Exception" + e.toString()); } return true; }// end onFling // These next methods we are required to have - even if unused - // in order for the Gesture Handling to work @Override public boolean onTouchEvent(MotionEvent motionEvent) { return this.gestureDetector.onTouchEvent(motionEvent); } @Override public void onLongPress(MotionEvent e) { // Intentionally not handling - must be overridden by listener class } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // Intentionally not handling - must be overridden by listener class // Intentionally returning true - per code examples return true; } @Override public void onShowPress(MotionEvent e) { // Intentionally not handling - must be overridden by listener class } @Override public boolean onSingleTapUp(MotionEvent e) { // Intentionally not handling - must be overridden by listener class // Intentionally returning true - per code examples return true; } @Override public boolean onDown(MotionEvent e) { // Intentionally not handling - must be overridden by listener class // Intentionally returning true - per code examples return true; } ... } 

    3 Solutions collect form web for “Bloqueo de onClick de Android enFling”

    La implementación de onTouchEvent es incorrecta. Simplemente devuelve el valor del resultado de gestureDector.

    Sin embargo, si su detector de gestos no detecta ningún gestos, le dice a la persona que llama "No tenía nada que hacer aquí" y el evento táctil nunca será enviado a los niños de la Actividad.

    Necesita llamar a super.onTouchEvent() si su detector de gestos no manejó el evento.

     @Override public boolean onTouchEvent(MotionEvent motionEvent) { if(this.gestureDetector.onTouchEvent(motionEvent)) { return true; } //no gesture detected, let Activity handle touch event return super.onTouchEvent(motionEvent); } 

    Por favor, preste atención a esta función:

     @Override public boolean onDown(MotionEvent e) { // Intentionally not handling - must be overridden by listener class // Intentionally returning true - per code examples return true; } 

    Por favor, cambie el valor de retorno a false.

    Usted puede simplemente devolver falso, cuando nada es hecho por su código … Deja que el sistema de eventos de movimiento gestionar todo por sí mismo. Devuelve la verdad, cuando quieras detener el evento para ser enviado a la vista de otros niños.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.