android View with View.GONE empfängt weiterhin onTouch und onClick


76

Das verwirrt mich:

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

Können Sie mir helfen?

Vielleicht von Interesse: Wenn ich mein Projekt starte, ist eine Ansicht GEGANGEN, die andere sichtbar. Dieses Mal funktioniert es wie erwartet (die GONE-Ansicht wird grundsätzlich ignoriert), aber nachdem Sie View.GONE über den Code eingestellt haben, funktioniert es nicht mehr.


1
Geschieht dies unmittelbar nach dem Aufruf von View.GONE? Nur für eine begrenzte Zeit? Dies hat möglicherweise damit zu tun, dass Änderungen an der Benutzeroberfläche nicht sofort wirksam werden.
Cheryl Simon

1
Wir brauchen mehr Infos. Versuchen Sie, mit dem hierarchyviewerTool den Status Ihrer Ansichtshierarchie zur Laufzeit zu überprüfen. Auf diese Weise können Sie den Sichtbarkeitsstatus und vieles mehr beim Debuggen von Ansichtsproblemen anzeigen.
Adamp

Vielen Dank. Dies geschieht unmittelbar nach dem Aufruf von View.GONE. Das Hierarchie-Viewer-Tool sagt, dass die Ansicht GEGANGEN ist, aber immer noch auf Klicks wird. Meine Plattform ist Cyanogenmod 2.2 (aber ich gehe davon aus, dass dies immer noch ein Problem in meinem Code ist: D)
ShadowMare

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

Nach View.GONE erhält das Layoutelement das Ereignis onClick (). Dies hat Animation View und Gone. Wie blockiere ich das?
Mikalaj Susla

Antworten:


112

Verwenden Sie möglicherweise Animationen, um die Ansichten ein- oder auszublenden? Ich bekomme dieses Verhalten, wenn ich Animationen mit android: fillEnabled = "true" verwende. Android: fillAfter = "true" Verstehe es nicht und scheint ein Fehler zu sein. Wenn ich Animationen ohne fillEnabled / fillAfter verwende, funktioniert alles wie erwartet. ..


2
Gibt es eine Umgehungsmöglichkeit? Ich verwende Nineoldandroids und sehe dieses Verhalten auf API10. Ich denke, es verwendet fillEnabled, um das 3.0-API-Verhalten beim Ändern der Ansichtseigenschaften nach der Animation zu simulieren.
Rafael Nobre

1
Ich habe dieses Problem auch mit Android Google 4.4.2 APIs.
GuilhE

Danke, stimmt das, das hat mir geholfen :)
Android Noob

Danke für den Hinweis, Android entfernen: fillAfter = "true", Animations-Listener anhängen mit 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); } } }); } hat das Ding gemacht, hoffe es hilft.
Fuchs

Vielen Dank, dass Sie mich vor leichten Kopfschmerzen
bewahrt haben

108

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


3
Dies ist eine bessere Antwort. Es gibt Szenarien, in denen Sie android:fillAfterund android:fillEnabledin Ihren Animationen verwenden möchten und die Ansicht nicht mehr reagieren soll.
Mick Byrne

1
Dieser hat bei mir funktioniert, aber da meine Animation ein oder zwei Sekunden dauert, wird clearAnimation()die Animation gestoppt und ich kann die Einblend-Ausblend-Animation nicht sehen. Stattdessen habe ich alpha.setFillAfter(false);in meiner Alpha-Animation genau das verwendet, was ich erwartet hatte.
Osayilgan

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

Ich glaube, diese Antwort ist besser als die akzeptierte, da das fillAfter-Verhalten erwünscht sein kann. Danke, du hast mir eine Welt voller Verletzungen gerettet.
ssawchenko

2
@osayilgan sollten Sie clearAnimation()Aufruf in onAnimationEnd()Methode setzen. Dann funktioniert es wie erwartet.
Saran

8

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


5

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


2

Was ich erwarte, ist, dass Sie eine Ansicht unsichtbar machen, Kinder jedoch immer noch auf Klicks reagieren (dh Ihre Ansicht ist eine ViewGroup). Sie könnten 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);
    }
}

dann muss man natürlich 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 in der Vergangenheit bei mir funktioniert. Ich kenne derzeit keinen besseren Weg, dies zu tun.


1
Nach 8 Jahren ist dies immer noch ein Problem. Dies funktioniert so lange, wie Sie keinen anderen Blick hinter sich haben.
Tamoxin

1

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

Beim Schreiben von "onClick" gehe ich davon aus, dass Sie das onClickAttribut in Ihrem XML-Layout verwenden. Versuchen Sie, anstelle des Attributs ein OnClickListenerwith festzulegen. Vielleicht hilft das... setOnClickListeneronClick


Danke für Ihre Antwort. Ich verwende bereits setOnClickListener anstelle des XML-Tags.
ShadowMare

1

Für diejenigen, die die obigen Antworten ausgeführt 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.

Dies mag übertrieben erscheinen, aber ich habe ganze Ansichtsgruppen ausgeblendet / angezeigt. In Ihrem Fall handelt es sich möglicherweise um eine Schaltfläche, eine Textansicht oder ein Bild. Diese Lösung funktioniert weiterhin.


2
Dies ist eigentlich das einzige, was für mich funktioniert hat. HINWEIS: Ich habe eine Ansicht verwendet, um eine andere Ansicht mit abzudeckenBottomSheetBehavior beim Laden von Daten . Bei allen anderen Antworten fing die Ansicht die Berührungen / Gesten ab. Und das hat meine BottomSheetBehaviour| gebrochen Android 8.0 mit Design-Support-Lib 27.0.2
Entreco

0

Versuchen Sie, .clearAnimation () in die Überschreibung onAnimationEnd einzufügen.


0

Wenn die Ansicht eine Animation enthält, sollten Sie view.clearAnimation aufrufen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.