Come consumare l'evento di touch della vista figlio nel touchlistener della visualizzazione padre?

Nella mia applicazione voglio get l'evento di touch di tutte le visualizzazioni figlio sulla vista di padre di onTouchListener ma non ho potuto get questo.

Esempio:

  • Ritaglia l'image salvata usando com.android.camera.action.CROP su android
  • Abilita la modalità Aereo su tutti i livelli API a livello di programmazione Android
  • Animatore di oggetti che non rimuove l'ascolto di aggiornamento android
  • Come triggersre / distriggersre 3G / 2G in SDK di Android
  • Che cosa significa lockCanvas (elaborato)
  • IllegalArgumentException: contenuto URL sconosciuto: // CONTENT
  • Vista la mia attività ho un layout di fotogrammi con alcuni pulsanti e edittext in esso. Quindi, each volta che touch pulsanti o per modificare il text voglio get questo evento di touch in onTouchListeners di onTouchListeners .

    Ecco il mio codice ..

    Attività:

     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: Così quando touch i pulsanti o edittext non riesco a toccare la coordinazione nel layout di layout di onTouchListener (Non è chiamato).

    Nota: non voglio aggiungere separato onTouchListener per tutti i childViews.

    Grazie in anticipo.

  • Test dell'unità Android utilizzando ant con il progetto della libreria
  • Riavvio dell'applicazione - Punto di ingresso attività
  • Come installare Android Studio su Ubuntu?
  • Come utilizzare il generatore di ShowCaseView v5 con frammenti?
  • mantenendo visibile l'elemento inferiore di ListView quando appare la tastiera
  • Come get il tempo dal server in android?
  • 4 Solutions collect form web for “Come consumare l'evento di touch della vista figlio nel touchlistener della visualizzazione padre?”

    Potresti averlo compiuto per superare dispatchTouchEvent nel layout.

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

    Quindi utilizzare quel layout al posto del solito FrameLayout:

     <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"> ... 

    Potresti anche saltare la chiamata super interamente se devi impedire alle viste dei bambini di ricevere l'evento, ma penso che questo sarebbe raro. Se hai bisogno di ricreare alcune, ma non tutte, delle funzionalità predefinite, c'è molto da riscrivere:

    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

    Ho provato una simile progettazione con (solo uno onTouch Listener su un rootLayout root) e ha funzionato. Ottengo tutti i punti a condizione che onTouch restituisca vero invece che falso. Altrimenti, ho appena il primo punto. Non ho potuto scoprire la ragione di questo problema di "return" dato che mi aspetto un comportmento opposto.

    Tuttavia, in base alla mia esperienza, se si imposta una vista di figlio cliccabile, il suo padrone di onTouch non functionrà. Se hai un'altra soluzione e se condividi, sarebbe fantastico.

    2 soluzioni:

    1. Utilizza onInceptTouchEvent sul ViewGroup, come mostrato qui

    2. Evitate di gestire il layout degli events touch e di avere una vista che rappresenta la vista figlio del layout, che copre la sua intera dimensione, per gestire gli events di contatto.

      Non è così efficiente come estendere le classi, ma è molto più facile e non richiede la creazione di nuovi file / classi.

      esempio:

      Basta aggiungere gli events di touch alla visualizzazione e gestirli invece di qualsiasi altra visualizzazione.

    Può essere ottenuto utilizzando "onInterceptTouchEvent". Prova questo, potrebbe funzionare

     @Override public boolean onInterceptTouchEvent(MotionEvent ev) { onTouchEvent(ev); return false; } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.