tutorial studio fragments example entre dinamicos diferencia activity android

example - fragments dinamicos android studio



Fragmento de Android onCreateView con gestos (2)

Estoy intentando utilizar gestos dentro de un fragmento; Tengo lo siguiente dentro de FragmentActivity que maneja el fragmento de mis detalles. Lo que estoy intentando que suceda es cuando se detecta un golpe en la vista para reemplazar los datos dentro de esa vista con la entrada anterior o siguiente.

Si hay una mejor manera de manejar esto; Estoy a favor de eso. Sin embargo, lo que está sucediendo aquí es que el método onFling nunca se llama realmente.

public static class DetailsFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (container == null) { return null; } View v = inflater.inflate(R.layout.my_view, null, false); final GestureDetector gesture = new GestureDetector(getActivity(), new GestureDetector.SimpleOnGestureListener() { @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { final int SWIPE_MIN_DISTANCE = 120; final int SWIPE_MAX_OFF_PATH = 250; final int SWIPE_THRESHOLD_VELOCITY = 200; try { if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) return false; if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { Log.i(Constants.APP_TAG, "Right to Left"); } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { Log.i(Constants.APP_TAG, "Left to Right"); titles.showDetails(getPosition() - 1); } } catch (Exception e) { // nothing } return super.onFling(e1, e2, velocityX, velocityY); } }); v.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return gesture.onTouchEvent(event); } }); return v; } }


Parece que el siguiente problema lo explica: Android: GestureDetector no detectará los gestos

Además aquí está el resultado:

La solución es en realidad Anular el método onDown y devolver verdadero; De lo contrario el detector de gestos se detendrá y no detectará el up:

final GestureDetector gesture = new GestureDetector(getActivity(), new GestureDetector.SimpleOnGestureListener() { @Override public boolean onDown(MotionEvent e) { return true; } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { Log.i(Constants.APP_TAG, "onFling has been called!"); final int SWIPE_MIN_DISTANCE = 120; final int SWIPE_MAX_OFF_PATH = 250; final int SWIPE_THRESHOLD_VELOCITY = 200; try { if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) return false; if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { Log.i(Constants.APP_TAG, "Right to Left"); } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { Log.i(Constants.APP_TAG, "Left to Right"); } } catch (Exception e) { // nothing } return super.onFling(e1, e2, velocityX, velocityY); } }); v.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return gesture.onTouchEvent(event); } });


un par de comentarios

  1. Tuve que modificar mi código de la siguiente manera:

    v.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // return gesture.onTouchEvent(event); gesture.onTouchEvent(event); return true; // <-- this line made the difference } });

  2. Además, si está utilizando un archivo xml para crear su vista

    View v = inflater.inflate(R.layout.my_view, null, false);

Asegúrese de que realmente está presionando la vista deseada. Una buena manera de exagerar la prueba es hacer que tanto el ancho como el alto de "match_parent" en lugar de "wrap_content" en su archivo xml de diseño.