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 llamado más nuevo. Alguna idea de por qué es así? Estoy construyendo una api de Google 4.0.3 aplicación, y estoy trzing para permitir los golpes para mi viewFliper. Sin embargo, no puede funcionar si on touch se llama más reciente.

Por cierto:

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

Thank u!

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 tienen scrollview implementado es posible que scroll tome esos eventos y los maneje. Y cómo detectar gestos si es así?

Author: gabrjan, 2012-10-26

4 answers

Encontré una solución perfecta. Implementé un nuevo método:

@Override
public boolean dispatchTouchEvent(MotionEvent event) {

    View v = getCurrentFocus();
    boolean ret = super.dispatchTouchEvent(event);

Y ahora todo funciona bien!

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;
}
 39
Author: gabrjan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-29 22:03:39

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 solo los eventos de toque:

@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 modo inmersivo cada vez que se tocó cualquier parte de la pantalla, independientemente de qué elemento. ¡Pero no deseaba establecer el modo inmersivo repetidamente!

 7
Author: Logic1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-17 23:46:38

Ok, ahora estoy seguro de que el problema es que scrollview manejar toca, así que de todos modos para ignorar que y sin embargo ser el desplazamiento disponible?

Sí, ese es el problema, cuando Android maneja eventos táctiles cada evento va de hijo a padre, por lo que primero es manejado por ViewFlipper, pero luego va a ScrollView. Así que tienes que implementar getParent ().requestDisallowInterceptTouchEvent (true) (ver ViewParent class) para hacer que todos los eventos táctiles sean manejados por ViewFlipper, y luego simplemente detecte la dirección del gesto si es horizontal, luego voltee la vista si no, luego pase el evento táctil a ScrollView o simplemente desplácese ScrollView programáticamente

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

 5
Author: Chaosit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-26 09:53:16

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

ADD: Recomiendo usar ViewPager para voltear vistas. En el ViewPager no necesitas implementar el tuyo 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

 1
Author: Lemberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-26 09:35:48