Android View mit View.GONE empfängt weiterhin onTouch und onClick

Lesezeit: 5 Minuten

Benutzer-Avatar
SchattenStute

Das verwirrt mich:

Soweit ich gelesen habe, eine Ansicht mit setVisibility(View.GONE); sollte keine Touch- oder Click-Events mehr erhalten. Mein Layout besteht aus zwei Teilen, die sichtbar oder verschwunden sind, sodass jeweils nur einer sichtbar und verwendbar ist, aber View.GONE reicht nicht aus. Ich kann die GONE-Ansicht wie erwartet nicht sehen, aber sie reagiert immer noch auf onClick (und verbraucht das Ereignis, das die andere Ansicht erhalten sollte).

Kannst du mir helfen?

Vielleicht interessant: Wenn ich mein Projekt starte, ist eine Ansicht WEG, die andere sichtbar. Diesmal funktioniert es wie erwartet (die GONE-Ansicht wird im Grunde ignoriert), aber nachdem View.GONE durch den Code gesetzt wurde, funktioniert es nicht mehr.

  • Geschieht dies unmittelbar nach dem Aufruf von View.GONE? Nur für eine begrenzte Zeit? Es könnte damit zu tun haben, dass UI-Änderungen nicht sofort wirksam werden.

    – Cheryl Simon

    18. Januar 2011 um 21:11 Uhr

  • Wir brauchen noch ein paar Infos. Versuchen Sie es mit der hierarchyviewer Werkzeug, um den Status Ihrer Ansichtshierarchie zur Laufzeit zu überprüfen. Dadurch können Sie den Sichtbarkeitsstatus und vieles mehr sehen, wenn Sie Ansichtsprobleme debuggen.

    – dämpfen

    19. Januar 2011 um 0:17 Uhr

  • Vielen Dank. Dies geschieht unmittelbar nach dem Aufruf von View.GONE. Das Hierarchyviewer-Tool sagt, dass die Ansicht GEGANGEN ist, aber immer noch onClick’s erhält. Meine Plattform ist Cyanogenmod 2.2 (aber ich gehe davon aus, dass dies immer noch ein Problem in meinem Code ist :D)

    – ShadowMare

    20. Januar 2011 um 20:11 Uhr

  • Ich habe das gleiche Problem ohne Animationen. Selbst wenn jedes Element in einer ViewGroup auf GONE gesetzt wird, kann ich immer noch den Inhalt eines GONE EditText auswählen und die Tastatur abrufen.

    – Philipp

    26. März 2014 um 23:26 Uhr

  • Nach View.GONE erhält das Element des Layouts das Ereignis onClick(). Dies hat Animationsansicht und Gone. Wie kann man das blockieren?

    – CleanCoder

    27. Juni 2020 um 6:12 Uhr

Benutzer-Avatar
edovino

Verwenden Sie vielleicht Animationen, um die Ansichten ein-/auszublenden? Ich bekomme dieses Verhalten, wenn ich Animationen verwende, die android:fillEnabled=”true” android:fillAfter=”true” haben. Verstehe es nicht und scheint ein Fehler zu sein – wenn ich Animationen ohne fillEnabled/fillAfter verwende, funktioniert alles wie erwartet. ..

  • Gibt es eine Problemumgehung? Ich verwende nineoldandroids und sehe dieses Verhalten auf API10 – ich denke, es verwendet fillEnabled, um das 3.0-API-Verhalten zum Ändern von Ansichtseigenschaften nach der Animation zu simulieren.

    – Raffael Nobre

    8. Februar 2013 um 14:20 Uhr

  • Ich habe dieses Problem auch mit Android Google 4.4.2 APIs.

    – Guilhe

    30. September 2014 um 17:02 Uhr

  • Danke, das stimmt, das hat mir geholfen 🙂

    – Android Noob

    7. Februar 2015 um 4:02 Uhr

  • Danke für den Hinweis, Android:fillAfter=”true” entfernen, Animations-Listener mit anhängen code @Override public void onAnimationEnd(Animation animation) { /* Android will make an exception when you change the view hierarchy * in animationEnd. http://stackoverflow.com/a/7445557/587186 */ new Handler().post(new Runnable() { public void run() { if (interventionPreview != null) { interventionPreview.setVisibility(View.GONE); } } }); } habe das Ding gemacht, hoffe es hilft.

    – Fuchs

    4. Februar 2016 um 14:46 Uhr


  • Danke, dass du mich vor leichten Kopfschmerzen bewahrt hast

    – Koen Van Looveren

    10. Juli 2016 um 11:03 Uhr

Benutzer-Avatar
Pawel Alexejew

Wenn Sie einstellen setVisibility(View.GONE) Versuchen Sie nach einer Animation (z. B. Ausblenden) die Animation mit zu löschen clearAnimation(). Das hat mir geholfen.

  • Dies ist eine bessere Antwort. Es gibt Szenarien, in denen Sie verwenden möchten android:fillAfter und android:fillEnabled in Ihren Animationen und Sie möchten, dass die Ansicht nicht mehr reagiert.

    – Mick Byrne

    28. September 2012 um 23:13 Uhr

  • Dieser hat für mich funktioniert, aber da meine Animation dann ein oder zwei Sekunden dauert clearAnimation() stoppt die Animation und ich kann die Einblend-Ausblend-Animation nicht sehen. Anstelle dessen habe ich verwendet alpha.setFillAfter(false); innerhalb meiner Alpha-Animation und es funktionierte genau so, wie ich es erwartet hatte.

    – osayilgan

    18. Dezember 2012 um 14:59 Uhr

  • Das ist die beste Antwort, danke! @osayilgan , in diesem Fall müssen Sie dort nur einen onEndAnimation-Listener und clearAnimation() festlegen, nachdem die Animation beendet ist.

    – Raffael Nobre

    8. Februar 2013 um 14:31 Uhr

  • Ich glaube, diese Antwort ist besser als die akzeptierte, da das FillAfter-Verhalten möglicherweise erwünscht ist. Danke, du hast mir eine Welt voller Schmerzen erspart.

    – ssawchenko

    1. August 2013 um 16:46 Uhr

  • @osayilgan solltest du setzen clearAnimation() anrufen onAnimationEnd() Methode. Dann funktioniert es wie erwartet.

    – Saran

    17. Februar 2014 um 14:34 Uhr

Versuchen Sie, die anklickbare Eigenschaft mit setClickable(false) nach setVisibility(View.GONE) auf false zu setzen.

Ja,mview.clearAnimation() habe einige Probleme, aber amination.setFillAfter(false);und mview.setClickable(false); FUNKTIONIERT perfekt.

Benutzer-Avatar
Siebe

Was ich erwarte, ist, dass Sie eine Ansicht unsichtbar machen, aber dass untergeordnete Ansichten immer noch auf Klicks reagieren (dh Ihre Ansicht ist eine ViewGroup). Du könntest etwas in der Art tun:

private void hideTheChildren(View v){
    if(v instanceof ViewGroup) {
        int count = ((ViewGroup)v).getChildCount();
        for(int k = 0 ; k < count ; k++) {
            hideTheChildren(((ViewGroup)v).getChildAt(k));
        }
        v.setVisibility(View.GONE);
    }
    else {
        v.setClickable(false);
        v.setVisibility(View.GONE);
    }
}

natürlich muss man dann auch das gegenteil machen

private void showTheChildren(View v){
    if(v instanceof ViewGroup) {
        int count = ((ViewGroup)v).getChildCount();
        for(int k = 0 ; k < count ; k++) {
            showTheChildren(((ViewGroup)v).getChildAt(k));
        }
        v.setVisibility(View.VISIBLE);
    }
    else {
        v.setClickable(true);
        v.setVisibility(View.VISIBLE);
    }
}

Das hat bei mir in der Vergangenheit funktioniert. Ich kenne derzeit keinen besseren Weg, dies zu tun.

  • Nach 8 Jahren ist das immer noch ein Problem. Dies funktioniert, solange Sie keine andere Ansicht dahinter haben.

    – Tamoxin

    21. März 2019 um 13:08 Uhr


Benutzer-Avatar
MICH

Ich hätte dies als Kommentar posten können, aber leider konnte ich keinen Kommentar posten. Da es eine mögliche Lösung für Sie sein könnte, poste ich es so:

Da Sie “onClick” schreiben, gehe ich davon aus, dass Sie die verwenden onClick -Attribut in Ihrem XML-Layout. Versuchen Sie, ein einzustellen OnClickListener mit setOnClickListener anstelle von onClick Attribut. Vielleicht hilft das…

  • Nach 8 Jahren ist das immer noch ein Problem. Dies funktioniert, solange Sie keine andere Ansicht dahinter haben.

    – Tamoxin

    21. März 2019 um 13:08 Uhr


Benutzer-Avatar
Kim Montano

Für diejenigen, die die obigen Antworten gemacht und ihre Probleme immer noch nicht gelöst haben, empfehle ich, die Ansicht aus der übergeordneten Ansicht zu entfernen. Wenn Sie die Ansicht erneut anzeigen müssen, erstellen Sie einfach eine Kopie und fügen Sie sie der übergeordneten Ansicht hinzu.

Das mag übertrieben erscheinen, aber ich habe ganze Ansichtsgruppen ausgeblendet / angezeigt. In Ihrem Fall könnte es sich um eine Schaltfläche, eine Textansicht oder ein Bild handeln. Diese Lösung funktioniert immer noch.

  • Das ist eigentlich das Einzige, was bei mir funktioniert hat. HINWEIS: Ich habe eine Ansicht verwendet, um eine andere Ansicht damit abzudecken BottomSheetBehavior beim Laden von Daten. Bei allen anderen Antworten unterbrach der Blick die Berührungen/Gesten. Und das hat mir geschadet BottomSheetBehaviour | Android 8.0 mit Design-Support-Lib 27.0.2

    – Entreco

    25. Januar 2018 um 20:54 Uhr


1284180cookie-checkAndroid View mit View.GONE empfängt weiterhin onTouch und onClick

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

Privacy policy