Übergeben von Berührungsereignissen an die übergeordnete Ansicht

Lesezeit: 5 Minuten

Ubergeben von Beruhrungsereignissen an die ubergeordnete Ansicht
Srichand Yella

Ich habe einen Brauch ViewSwitcher in dem ich Berührungsereignisse implementiert habe, damit ich mit dem Touchscreen durch Bildschirme scrollen kann.

Meine Layout-Hierarchie sieht so aus:

<ViewSwitcher>

    <LinearLayout>
        <ListView />
    </LinearLayout>

    <LinearLayout>
        <ListView />
    </LinearLayout>

</ViewSwitcher>

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!

Ubergeben von Beruhrungsereignissen an die ubergeordnete Ansicht
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.

    – KarolDepka

    16. Januar 16 um 20:36 Uhr


  • Weitere Informationen zu dieser Antwort (richtig gemacht) hier: developer.android.com/training/gestures/viewgroup.html

    – NineToeNerd

    26. Mai ’16 um 18:59 Uhr

  • 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

Ubergeben von Beruhrungsereignissen an die ubergeordnete Ansicht
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 …

Von dem Android-Dokumentation :

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

1643041387 718 Ubergeben von Beruhrungsereignissen an die ubergeordnete Ansicht
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

1643041387 31 Ubergeben von Beruhrungsereignissen an die ubergeordnete Ansicht
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.

.

620370cookie-checkÜbergeben von Berührungsereignissen an die übergeordnete Ansicht

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy