2012-04-06 3 views
18

In meiner Anwendung möchte ich das Touch-Ereignis aller untergeordneten Ansichten in der onTouchListener der übergeordneten Ansicht abrufen, aber ich konnte das nicht bekommen.Wie kann das Touch-Ereignis der untergeordneten Ansicht im Touchlistener der Elternansicht verwendet werden?

Beispiel:

In Anbetracht meiner Tätigkeit des Ich habe ein Frame-Layout, die einige Tasten und edittexts in ihm hat. Also, wann immer ich Tasten berühre oder Text bearbeite, möchte ich dieses Berührungsereignis in framlayoutsonTouchListeners bekommen.

Hier ist mein Code ..

Aktivität:

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> 

Problem: So whenver ich die Tasten berühren oder EditText Ich kann in meinem frame-Layout onTouchLi keine Touch-Co-Edition bekommen steener (wird nicht genannt).

Hinweis: Ich möchte nicht separate OnTouchListener für alle ChildViews hinzufügen.

Vielen Dank im Voraus.

Antwort

3

Ich habe versucht, ähnliches Design mit (nur ein onTouch Listener auf einem root FrameLayout) und es hat funktioniert. Ich bekomme alle Punkte, vorausgesetzt onTouch gibt true statt false zurück. Ansonsten bekomme ich nur den ersten Punkt. Ich konnte den Grund für dieses "Rückkehr" -Problem nicht herausfinden, da ich ein entgegengesetztes Verhalten erwarte.

Wenn Sie jedoch eine der untergeordneten Ansichten auf anklickbar setzen, funktioniert die OnTouch-Funktion des übergeordneten Elements meiner Erfahrung nach nicht. Wenn Sie eine andere Lösung haben und wenn Sie teilen, wäre das großartig.

22

Sie könnten dies durch Überschreiben dispatchTouchEvent im Layout erreichen.

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

dann, dass das Layout anstelle der üblichen FrameLayout verwenden:

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

Sie können auch den Super-Anruf überspringen vollständig, wenn Sie Kind Ansichten verhindern, müssen aus dem Ereignis empfangen haben, aber ich denke, das würde selten sein. Wenn Sie einige neu erstellen müssen, aber nicht alle, die Standard-Funktionalität, gibt es eine Menge zu umschreiben:

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 Lösungen:

  1. Verwenden onInterceptTouchEvent auf der Viewgroup, wie gezeigt here

  2. Vermeiden Sie, dass das Layout die Berührungsereignisse behandelt und dass eine Ansicht die untergeordnete Ansicht des Layouts ist, die seine gesamte Größe abdeckt, um die Berührungsereignisse zu verarbeiten.

    Es ist nicht so effizient wie das Erweitern von Klassen, aber es ist viel einfacher und erfordert nicht das Erstellen neuer Dateien/Klassen.

    Beispiel:

    Fügen Sie einfach die Touch-Ereignisse auf die Ansicht, und es wird sie statt einer der anderen Ansichten behandeln.

-1

Dies kann mit "onInterceptTouchEvent" erreicht werden. Bitte versuchen Sie dies, es kann funktionieren

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

Es ist keine gute Idee, manuell onTouchEvent Methode ... – Crisic

Verwandte Themen