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