2014-01-09 5 views
22

Ich habe eine RelativeLayout und dieses Layout hat fast 10 Ansichten darin.Handling Intercept Touch-Ereignis ohne Erweiterung ViewGroup

Ich habe OnTouchListener zu diesem Layout und einige Arbeit darin getan und true zurückgeben.

dieser Listener funktioniert gut, wenn ich das Layout berühre, wo es keine Ansicht gibt (Mittelwert auf leerer Bereich). Wenn ich Kindansichten dieses Layouts berühre, löst dieser Listener nicht aus ...

und ich verstehe, dass wir onInterceptTouchEvent() überschreiben können, indem wir ViewGroup (also hier RelativeLayout) erweitern und Berührungsereignisse behandeln, bevor Kindansichten konsumieren Dieses Ereignis ...

Dies wird einen Trick machen, aber ich muss viele XML-Dateien ändern, wo ich diese Funktionalität brauche, indem ich RelativeLayout durch mein CustomRelativeLayout ersetze.

so meine Frage ist:

ist es eine Möglichkeit, Berührungsereignis für RelativeLayout (ofcourse Viewgroup) vor Blick in RelativeLayout verbraucht Ereignis Kind zu behandeln? Ich will nicht RelativeLayout erweitern ...

+0

gibt es keine solche Art und Weise: Sie RelativeLayout – pskink

Antwort

0

onTouchListener hinzufügen Ausprobieren

RelativeLayout rl = (RelativeLayout) findViewById(R.id.relativeLauout); 
    rl.setOnTouchListener(new OnTouchListener() { 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      // do something 
      return false; 
     } 
    }); 

oder Verwendung Methode onTouchEvent von Aktivität außer Kraft zu setzen

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    // TODO Auto-generated method stub 
    return super.onTouchEvent(event); 
} 
+0

Vielen Dank für Ihre Antwort zu verlängern haben ... Ich habe Ihre beiden Möglichkeiten ausprobiert, bevor Frage zu stellen ... aber es funktioniert nicht :-( – RuntimeException

+0

mayby ​​versuchen onTouchListener erweitern und sie setzen zu allen Ansichten im Layout – kris14an

+0

das mag Arbeit, aber ich muss viel Code in fast 12 Aktivitäten schreiben ... – RuntimeException

18

Try

@Override 
public boolean dispatchTouchEvent(MotionEvent ev) { 
    return super.dispatchTouchEvent(ev); 
} 

RelativeLayout von Activity. Diese Methode ist die erste, die Berührungsereignisse verarbeitet. Aber in diesem Fall müssen Sie mit aktuellen Koordinaten der Ansichten

+0

hast du meinen Nachmittag Mann gemacht, danke;) – Hugo

-2

Sie können einfach in Ruhe einstellen xml arbeiten:

android:clickable="true" 
+0

Ich habe dies für ein RelativeLayout ohne Erfolg versucht. – Matt

0

Versuchen im onTouchEvent() Methode der Kinder Ansichten als falsch zurück, wenn ACTION_DOWN Ereignis zu verarbeiten. So werden die Weiterleitungserkennungsereignisse nicht an untergeordnete Ansichten gesendet, auch wenn das Ereignis nicht verbraucht wird.

1

Obwohl dies nicht unbedingt ideal ist, funktioniert dies auch für kleinere Layouts, die keinen dynamischen Inhalt haben.

Setzen Sie in XML android:clickable="false" auf alle untergeordneten Elemente der ViewGroup im Layout (einschließlich verschachtelter ViewGroups und ihrer untergeordneten Elemente). Jedes Kind, auf das geklickt wird, leitet den Klick an sein Elternelement weiter und gelangt schließlich zu den standardmäßigen Touch-Handlern der ViewGroup. Stellen Sie sicher, dass root Viewgroup setzen, in dem Sie die Click-Ereignisse als android:clickable="true" oder viewgroup.setClickable(true)

erhalten möchten Wenn Sie Ansichten dynamisch hinzufügen, stellen Sie sicher, view.setClickable(false); zu nennen, bevor es zu der Ansicht Hierarchie hinzufügen.