El método onTouchEvent no se llama

Estoy teniendo un problema que mi método

@Override public boolean onTouchEvent(MotionEvent event) { return gestureDetector.onTouchEvent(event); } 

Es más nuevo llamado. Cualquier idea ¿por qué es así? Estoy construyendo una aplicación de Google google api 4.0.3, y estoy trzing para permitir swipes para mi viewFliper. Sin embargo no puede trabajar si en tacto es más nuevo llamado.

Btw:

  public class MainActivity extends SherlockMapActivity implements ActionBar.TabListener { 

Esa es la declaración de mi actividad. Y para detectar swipes he implementado que:

  SimpleOnGestureListener simpleOnGestureListener = new SimpleOnGestureListener(){ @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) { float sensitvity = 50; if((e1.getX() - e2.getX()) > sensitvity){ SwipeLeft(); }else if((e2.getX() - e1.getX()) > sensitvity){ SwipeRight(); } return true; } }; GestureDetector gestureDetector= new GestureDetector(simpleOnGestureListener); 

¡Gracias!

editar:

Main.xml:

  <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main_view" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" > <ViewFlipper android:id="@+id/ViewFlipper" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#ffffff" > <include android:layout_height="match_parent" layout="@layout/mymain" /> <include layout="@layout/secondmain" /> <include layout="@layout/thirdmain" /> <include layout="@layout/fourthmain" /> </ViewFlipper> </LinearLayout> 

Edit2: todos mis diseños incluidos han scrollview implementado es posible que el desplazamiento toma que los eventos y manejarlos. ¿Y cómo detectar gestos si es así?

Bueno, yo encuentro una solución perfecta. I mplemented nuevo método:

  @Override public boolean dispatchTouchEvent(MotionEvent event) { View v = getCurrentFocus(); boolean ret = super.dispatchTouchEvent(event); 

Y ahora todo funciona bien!

Gracias a todos por ayudarme a llegar hasta aquí …

Editar:

Mi código final:

 @Override public boolean dispatchTouchEvent(MotionEvent event) { View v = getCurrentFocus(); if (v instanceof EditText) { View w = getCurrentFocus(); int scrcoords[] = new int[2]; w.getLocationOnScreen(scrcoords); float x = event.getRawX() + w.getLeft() - scrcoords[0]; float y = event.getRawY() + w.getTop() - scrcoords[1]; if (event.getAction() == MotionEvent.ACTION_UP && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w .getBottom())) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(getWindow().getCurrentFocus() .getWindowToken(), 0); } } boolean ret = super.dispatchTouchEvent(event); return ret; } 

Ok, ahora estoy seguro de que el problema es que scrollview manejar toques, por lo que de todos modos ignorar que y sin embargo, el desplazamiento disponible?

Sí, ese es el problema, cuando androide maneja eventos táctiles cada evento va de niño a padre, por lo que primero es manejado por ViewFlipper, pero luego va a ScrollView. Así que tienes que implementar getParent (). RequestDisallowInterceptTouchEvent (true) (vea la clase ViewParent ) para hacer que todos los eventos táctiles sean manejados por ViewFlipper, y simplemente detectar la dirección del gesto si horizontal, luego voltear la vista si no entonces pasar el evento touch ScrollView O simplemente desplazarse por ScrollView mediante programación

EDIT: También puede implementar OnTouchListener en su ViewFlipper y en este activador de escucha GestureDetector.onTouchEvent (event), pero esto también requiere requestDisallowInterceptTouchEvent de su vista padre establecida en true

Como escribí en los comentarios del post de Gabrjan que esto se dispara continuamente mientras toca la pantalla, en realidad hay una manera fácil de obtener sólo los eventos de touchdown:

 @Override public boolean dispatchTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { System.out.println("TOUCH DOWN!"); //set immersive mode here, or whatever... } return super.dispatchTouchEvent(event); } 

Esto fue muy útil para mí para poner el Android en el modo de inmersión siempre que cualquier parte de la pantalla se tocó independientemente de qué elemento. ¡Pero no deseé fijar el modo inmersivo repetidamente!

Todos los gestos y eventos táctiles van al elemento más bajo en la jerarquía de la visión que puede manejarlo. Por lo tanto, si tiene algún oyente en el diseño incluido, puede llamar a ((TypeOfParrent)yourView.getParent()).onTouchEvent(event) para delegar el evento en el controlador que desea.

ADD: Te recomiendo que utilices ViewPager para voltear las vistas. En ViewPager no necesita implementar su propio onGestureListener.

http://www.edumobile.org/android/android-beginner-tutorials/view-pager-example-in-android-development/

http://developer.android.com/reference/android/support/v4/view/ViewPager.html

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