2012-04-06 14 views
18

En mi aplicación quiero obtener el evento táctil de todas las vistas secundarias en mi vista principal onTouchListener pero no pude obtener esto.¿Cómo se consume el evento táctil de la vista infantil en el lector táctil de la vista principal?

Ejemplo:

En opinión de mi actividad que tienen una disposición de marcos que tiene algunos botones y edittexts en ella. Así que cada vez que toco botones o edito texto quiero obtener este evento táctil en framlayout'sonTouchListeners.

Aquí está mi código ..

Actividad:

private FrameLayout rootView; 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     rootView = (FrameLayout) findViewById(R.id.rootview); 
     rootView.setOnTouchListener(new OnTouchListener() 
     { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) 
      { 
       Log.e("Touch Event: ", " X: " + event.getX() + " Y: " + event.getY()); 
       return false; 
      } 
     }); 
     } 

main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="10dip" 
    android:id="@+id/rootview"> 

<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="@android:color/white" 
    android:orientation="vertical" 
    android:layout_gravity="center" 
    android:padding="10dip"> 

    <TextView 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_gravity="center" 
        android:padding="4dp" 
        android:text="Login" 
        android:textColor="@android:color/black" 
        android:textSize="16dp" 
        android:textStyle="bold" /> 

       <TextView 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_marginTop="10dp" 
        android:text="Username" 
        android:textColor="@android:color/black" 
        android:textSize="14dp" 
        android:textStyle="bold" /> 

       <EditText 
        android:id="@+id/edttextusername" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:imeOptions="flagNoExtractUi" 
        android:singleLine="true" /> 

       <TextView 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_marginTop="10dp" 
        android:text="Password" 
        android:textColor="@android:color/black" 
        android:textSize="14dp" 
        android:textStyle="bold" /> 

       <EditText 
        android:id="@+id/edttextpassword" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:imeOptions="flagNoExtractUi" 
        android:password="true" /> 

       <LinearLayout 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_gravity="center" 
        android:gravity="center" 
        android:orientation="horizontal" 
        android:padding="10dp" > 

        <Button 
         android:id="@+id/btnlogin" 
         android:layout_width="0dip" 
         android:layout_height="40dip" 
         android:layout_marginRight="5dp" 
         android:layout_weight="1" 
         android:enabled="false" 
         android:text="Login" 
         android:padding="5dip" 
         android:textColor="@android:color/black" 
         android:textStyle="bold" 
         /> 

        <Button 
         android:id="@+id/btncall" 
         android:layout_width="0dip" 
         android:layout_height="40dip" 
         android:layout_marginLeft="5dp" 
         android:layout_weight="1" 
         android:padding="5dip" 
         android:text="Cancel" 
         android:textColor="@android:color/black" 
         android:textStyle="bold" /> 
       </LinearLayout> 


</LinearLayout> 

    </FrameLayout> 

Problema: Así whenver toco los botones o EditarTexto No puedo obtener la co-ordition táctil en el diseño de mi marco onTouchLi Stener (No se llama).

Nota: No deseo agregar toTouchListener por separado para todas las vistas de niños.

Gracias de antemano.

Respuesta

3

He intentado un diseño similar con (solo un OnTouch Listener en una raíz FrameLayout) y funcionó. Obtengo todos los puntos provistos que onTouch devuelve verdadero en lugar de falso. De lo contrario, obtengo el primer punto. No pude averiguar el motivo de este problema de "devolución" ya que espero un comportamiento contrario.

Sin embargo, en función de mi experiencia, si configuras cualquier vista secundaria en la que se pueda hacer clic, la función onTouch de sus padres no funcionará. Si tienes otra solución y si la compartes, sería genial.

22

Puede lograr eso anulando dispatchTouchEvent en el diseño.

public class MyFrameLayout extends FrameLayout { 
    @Override 
    public boolean dispatchTouchEvent(MotionEvent e) { 
     // do what you need to with the event, and then... 
     return super.dispatchTouchEvent(e); 
    } 
} 

A continuación, utilice ese diseño en lugar de la FrameLayout habitual:

<com.example.android.MyFrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="10dip" 
    android:id="@+id/rootview"> 
    ... 

También podría saltar el súper llamada por completo si es necesario para evitar puntos de vista del niño desde la recepción del evento, pero creo que esto haría ser raro Si necesita volver a crear algunos, pero no todos, de la funcionalidad por defecto, hay una gran cantidad de reescribir:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.1_r1/android/view/ViewGroup.java#ViewGroup.dispatchTouchEvent%28android.view.MotionEvent%29

2

2 soluciones:

  1. Uso onInterceptTouchEvent en el ViewGroup, como se muestra here

  2. Evite que el diseño controle los eventos táctiles y tenga una vista que sea la vista secundaria del diseño, que cubra todo su tamaño, para manejar los eventos táctiles.

    No es tan eficiente como extender clases, pero es mucho más fácil y no requiere crear nuevos archivos/clases.

    ejemplo:

    Sólo añadir los eventos de toque a la vista, y que se encargará de ellos en lugar de cualquiera de los otros puntos de vista.

-1

Se puede lograr utilizando "onInterceptTouchEvent". Por favor, intente esto, puede funcionar

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    onTouchEvent(ev); 
    return false; 
} 
+0

No es una buena idea llamar manualmente al métodoTouchEvent ... – Crisic

Cuestiones relacionadas