Wenn ich ein Fragment (Vollbild mit #77000000
Hintergrund) über einem anderen Fragment zeige (nennen wir es Hauptfragment), reagiert mein Hauptfragment immer noch auf Klicks (wir können auf eine Schaltfläche klicken, auch wenn wir es nicht sehen).
Frage : Wie kann man Klicks auf das erste (Haupt-) Fragment verhindern?
BEARBEITEN
Leider kann ich das Hauptfragment nicht einfach ausblenden, da ich für das zweite Fragment einen transparenten Hintergrund verwende (damit der Benutzer sehen kann, was sich dahinter befindet).
android
android-fragments
Dmitry Zaytsev
quelle
quelle
Visibility
auf festzulegenmain
Fragment
,GONE
wenn Sie sie nicht verwenden.onClick
Methode gibt nichts zurück. Aber du gibst eine Idee, danke (ich werde bald eine Antwort posten).Antworten:
Setzen Sie die
clickable
Eigenschaft in der Ansicht des zweiten Fragments auf true. Die Ansicht fängt das Ereignis ab, sodass es nicht an das Hauptfragment übergeben wird. Wenn also die Ansicht des zweiten Fragments ein Layout ist, wäre dies der Code:quelle
RelativeLayout
innerhalb des Fragments und ich setze die gesamte Ansicht mit derclickeable
Eigenschaft. Die Lösung von @Dmitry löst mein Problem.Die Lösung ist ziemlich einfach. In unserem zweiten Fragment (das unser Hauptfragment überlappt) müssen wir nur das
onTouch
Ereignis abfangen :quelle
Fügen Sie einfach
clickable="true"
undfocusable="true"
zum übergeordneten Layout hinzuWenn Sie verwenden
AndroidX
, versuchen Sie diesquelle
focuseable
ist nicht wirklich notwendig.focusable="true"
hier ist nur, um eine Warnung in Android Studio zu vermeiden.Sie sollten das erste Fragment ausblenden, wenn Sie das zweite Fragment anzeigen, wenn zwei Fragmente in derselben Containeransicht platziert sind.
quelle
Sie müssen hinzufügen
android:focusable="true"
mitandroid:clickable="true"
Clickable
bedeutet, dass es von einem Zeigergerät angeklickt oder von einem Touch-Gerät getippt werden kann.Focusable
bedeutet, dass es den Fokus von einem Eingabegerät wie einer Tastatur erhalten kann. Eingabegeräte wie Tastaturen können anhand der Eingaben selbst nicht entscheiden, an welche Ansicht ihre Eingabeereignisse gesendet werden sollen. Sie senden sie daher an die Ansicht mit Fokus.quelle
Es gibt mehr als eine Lösung, die einige von uns zu diesem Thread beigetragen haben, aber ich möchte auch eine andere Lösung erwähnen. Wenn Sie keine Lust haben, klickbar und fokussierbar zu setzen, entspricht dies der Root-ViewGroup jedes Layouts in XML wie mir. Sie können es auch in Ihre Basis stellen, wenn Sie eines wie unten haben.
Ich hoffe, es hilft für diejenigen, die Layout-XMLs hassen.
quelle
Die akzeptable Antwort "funktioniert", verursacht aber auch Leistungskosten (Überziehen, erneutes Messen bei Orientierungsänderung), da das Fragment unten noch gezeichnet wird. Vielleicht sollten Sie das Fragment einfach anhand des Tags oder der ID finden und die Sichtbarkeit auf GONE oder VISIBLE setzen, wenn Sie es erneut anzeigen müssen.
In Kotlin:
Diese Lösung ist der Alternative
hide()
und denshow()
Methoden derFragmentTransaction
Verwendung von Animationen vorzuziehen . Sie nennen es einfach aus demonTransitionStart()
undonTransitionEnd()
vonTransition.TransitionListener
.quelle
Metod 1:
Sie können allen Fragmenten ein Layout hinzufügen
Metod 2: (programmatisch)
Erweitern Sie alle Fragmente von
FragmentBase
usw. Fügen Sie dann diesen Code hinzuFragmentBase
quelle
Was Sie tun können, ist, dass Sie einen leeren Klick auf das Layout des vorherigen Fragments geben können, indem Sie die onClick-Eigenschaft zum übergeordneten Layout dieses Hauptfragments verwenden. In der Aktivität können Sie eine Funktion erstellen
doNothing(View view)
und nichts darin schreiben. Dies wird es für Sie tun.quelle
Dies klingt nach einem Fall für DialogFragment. Andernfalls verpflichten Sie sich mit Fragment Manager, einen auszublenden und den anderen anzuzeigen. Das hat bei mir funktioniert.
quelle
Das Hinzufügen von
android:clickable="true"
hat bei mir nicht funktioniert. Diese Lösung funktioniert nicht mit CoordinatorLayout, wenn es sich um ein übergeordnetes Layout handelt. Aus diesem Grund habe ich RelativeLayout als übergeordnetes Layout erstellt, hinzugefügtandroid:clickable="true"
und CoordinatorLayout in dieses RelativeLayout eingefügt .quelle
Ich hatte mehrere Fragmente mit derselben XML.
Nachdem ich Stunden verbracht hatte, entfernte ich mich
setPageTransformer
und es fing an zu funktionierenIch hatte eine schreckliche Logik.
quelle