Das Problem besteht nun darin, dass die Touch-Ereignisse von der verbraucht werden ListViews und ich kann die Ansichten nicht wechseln. Es funktioniert gut, wenn ich das nicht habe ListViews. Ich muss in der Lage sein, durch die Ansichten zu scrollen und die zu scrollen ListView.
Wie löse ich das?
BEARBEITEN: Ich brauche auch die ListView Elemente anklickbar sein.
Vielen Dank im Voraus!
Srichand Yella
Vielen Dank an alle für die Beantwortung der Frage. Aber ich konnte es auf eine viel einfachere Weise herausfinden. Seit mein ViewSwitcher das Berührungsereignis nicht erkannte, habe ich das Berührungsereignis abgefangen, genannt the onTouchEvent() Und kehrte zurück false. Hier:
@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{
onTouchEvent(ev);
return false;
}
Durch Überschreiben der onInterceptTouchEvent(), konnte ich das Berührungsereignis in der Aktivität abfangen. Dann rief ich die an onTouchEvent() in dem ViewSwitcher das übernimmt die Umschaltung der ListViews. Und schließlich durch die Rückkehr false, es stellt sicher, dass die ViewGroup verbraucht das Ereignis nicht.
Angenommen, ich möchte eine horizontalScrollView in den Zellen der GridView haben, warum funktioniert die Verwendung dieser Lösung in diesem Fall nicht gut und erlaubt mir, sowohl horizontal zu scrollen als auch auf Zellen der GridView zu klicken / lange zu klicken?
– Android-Entwickler
18. Januar 14 um 14:32 Uhr
Das hat mir geholfen, ein ViewPager-Problem zu lösen, dachte, ich würde es für die Nachwelt wegwerfen. Ich habe Ansichten in einem ViewPager, an die OnClickListener/OnTouchListener s angehängt sein müssen. Diese verbrauchen Bewegungsereignisse, was dazu führt, dass der übergeordnete ViewPager nicht scrollt. Indem ich diesen Trick auf das Layout anwende, das den View-Pager enthält, kann ich alle Berührungsereignisse an den Pager (Scroller) weiterleiten, unabhängig davon, ob das Kind das Ereignis als Klick aufnimmt oder nicht.
– mszaro
13. März 15 um 21:10 Uhr
Ich glaube nicht, dass es der “offizielle” Weg ist, onTouchEvent() in onInterceptTouchEvent() aufzurufen, es sei denn, dies ist als eine Art Hack gemeint. Weil onTouchEvent() sowieso aufgerufen wird, wenn Sie true von onInterceptTouchEvent() zurückgeben.
Nach stundenlangem Ausprobieren mit anderen Lösungen habe ich diese gefunden, und sie hat in meinem Fall funktioniert. Eine horizontale Bildlaufansicht und ein übergeordnetes lineares Layout, bei dem das lineare Layout keine Touch-Ereignisse empfing
– Deny
19. August 18 um 15:40 Uhr
macio.Jun
Der einfachste Weg, das TouchEvent der untergeordneten Ansicht an die übergeordnete Ansicht zu übergeben, besteht darin, dies der untergeordneten Ansicht hinzuzufügen:
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
return false;
}
Dies ist die einzige Lösung, die für mich für RecyclerView funktioniert hat. Sieht so aus, als müssten Sie RecyclerView erweitern, onTouchEvent überschreiben und dadurch alle weiteren Interaktionen darauf deaktivieren und die Ereigniskette wird fortgesetzt.
– Georgi
30. März 17 um 19:03 Uhr
Wenn ich dies zu meiner Recycler-Ansicht hinzufüge, nimmt das Listenelement keine Klickereignisse an
– Hitesh Sahu
4. Februar 19 um 13:15 Uhr
In meinem übergeordneten Layout habe ich die einzige Möglichkeit gefunden, das Kind daran zu hindern, das Touch-Ereignis zu erfassen, indem ich onInterceptTouchEvent überschreibe, um true zurückzugeben.
@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{
return true;
}
Ich glaube nicht, dass es für Sie eine einfache Möglichkeit gibt, dies zu tun.
Es ist nicht so kompliziert, aber Sie müssen Ihre eigene Ansicht erstellen, die die ListView erweitert. Dann kannst du die überschreiben onTouch Handler und entscheiden Sie (je nach Berührungsereignis), ob Sie es behandeln (und wahr zurückgeben) oder an die übergeordnete Ansicht weitergeben möchten.
Das Problem ist auch, dass, sobald eine Ansicht ein Berührungsereignis verarbeitet, es diejenige ist, die alle verbleibenden erhält …
onTouch() – Dies gibt einen booleschen Wert zurück, um anzugeben, ob Ihr Listener dieses Ereignis verarbeitet. Wichtig ist, dass dieses Ereignis mehrere Aktionen haben kann, die aufeinander folgen. Wenn Sie also beim Empfang des Aktionsereignisses „down“ „false“ zurückgeben, geben Sie an, dass Sie das Ereignis nicht verbraucht haben und auch nicht an nachfolgenden Aktionen dieses Ereignisses interessiert sind. Daher werden Sie nicht für andere Aktionen innerhalb des Ereignisses aufgerufen, wie z. B. eine Fingergeste oder das eventuelle Aufwärts-Aktionsereignis
Wenn Sie also beispielsweise eine vertikale Bewegung haben möchten, um durch die Liste zu scrollen, und während des gleichen Berührungsereignisses (ohne den Finger zu heben), eine horizontale Bewegung zum Umschalten der Ansichten wünschen, wird das eine ziemliche Herausforderung.
Aber wenn Sie zum Beispiel Gesten verwenden oder alles in Ihrer benutzerdefinierten Ansicht handhaben können und abhängig davon, was das MotionEvent ist, Befehle an den ViewSwitcher senden.
Haben Sie versucht, die ListView-Elemente wie folgt als nicht anklickbar festzulegen: listView.setClickable(false); Dadurch sollte das Click-Event nach oben propagiert werden.
Das hat es nicht behoben. Und ich brauche auch die Elemente der Listenansicht, um anklickbar zu sein.
– Srichand Yella
16. Juni 11 um 17:21 Uhr
Steve Prentice
Wenn Ihre Ansicht das Ereignis überspringen möchte, stellen Sie sicher, dass Sie in onTouchEvent false zurückgeben. Andernfalls geht die Plattform davon aus, dass Sie das Ereignis verbraucht haben, und es ist keine weitere Verarbeitung erforderlich.
Das hat es nicht behoben. Und ich brauche auch die Elemente der Listenansicht, um anklickbar zu sein.
– Srichand Yella
16. Juni 11 um 17:21 Uhr
Zephyr Yang
Was ich getan habe, ist, einen Toucheventlistener auf die Listenansicht im Viewswitcher zu setzen, das Ereignis zu behandeln, die Fling-Aktion zu erkennen und die Metchod von Viewswitcher aufzurufen. Es klappt.
.
6203700cookie-checkÜbergeben von Berührungsereignissen an die übergeordnete Ansichtyes