2015-01-27 7 views
6

In meinem Layout Ich habe eine Struktur wie folgt aus:Wie klicke ich in die untergeordneten Ansichten und in die übergeordneten ViewGroups?

--RelativeLayout 
    | 
    --FrameLayout 
    | 
    --Button, EditText... 

I Touch-Ereignisse in der RelativeLayout und im FrameLayout behandeln wollen, so habe ich die onTouchListener in diesen beiden Gruppen Ansicht. Aber nur die Berührung im RelativeLayout wird erfasst.

Um dies zu lösen, schrieb ich meine eigene CustomRelativeLayout und überschreiben die onInterceptTouchEvent, jetzt wird der Klick in der untergeordneten ViewGroup (FrameLayout) erfasst, aber der Klick in den Schaltflächen und anderen Ansichten macht keinen Effekt.

In meinem eigenen benutzerdefinierten Layout, ich habe dies:

public boolean onInterceptTouchEvent(MotionEvent ev) { 
    return true; 
} 

Antwort

6

Sie müssen die onInterceptTouchEvent() für jedes Kind außer Kraft setzen, andernfalls bleibt es ein onTouchEvent für die Eltern.

Intercept Touch Events in a ViewGroup

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    /* 
    * This method JUST determines whether we want to intercept the motion. 
    * If we return true, onTouchEvent will be called and we do the actual 
    * scrolling there. 
    */ 
... 
    // In general, we don't want to intercept touch events. They should be 
    // handled by the child view. 
    return false; 
} 

Sie müssen falsch zurück das Kind damit umgehen zu haben, sonst hat man es an die Eltern zurückkommen.

+1

Angenommen, ich möchte die Berührungsereignisse nur für die Behandlung einiger der untergeordneten Elemente überschreiben. Was kann ich in dieser Funktion tun, damit sie funktioniert? Ich meine, für einige Kinder würde es wie gewohnt funktionieren, und für einige wird die Elternsicht entscheiden, ob sie die Berührungsereignisse erhalten oder nicht. –

+0

@androiddeveloper das ist eine wirklich gute Frage. Warum postest du es nicht als Frage? –

+0

@androiddeveloper Ich fragte und beantwortete diese Frage hier: http://stackoverflow.com/questions/30966412/how-to-vary-between-child-and-parent-view-group-touch-events, wenn Sie interessiert sind. –

1

Ihre individuelle Lösung Touch-Ereignisse überall in Ihrem relativen Layout erfassen wird die überschriebene Methode, da immer gesetzt ist wahr zu werfen.

Für Ihre Anforderung, ich denke, es ist besser zu verwenden die OnClick-Methode, anstatt mit onTouch.

OnTouch Methode ruft verschiedene Threads auf jedem Touch und ich denke, dass die Ursache des Problems ist

Anstatt diese Ereignisse Umgang mit seiner besseren onClick Methode zu versuchen.

+0

Vielen Dank, aber selbst wenn ich onClick in den beiden Ansichtsgruppen einstelle, wird nur der Klick in der ersten (RelativeLayout) behandelt. – androidevil

+1

Die Freigabe des Codes wird die Dinge sicherlich klarer machen. – testuserx