Nachdem Sie eine Paar Fragen gesehen haben hier auf SO in Bezug auf Fragments
"Weitergabe" ihrer Klickereignisse auf klickbare Views
im zugrunde liegenden Fragments
, erinnerte ich mich, dass ich einmal auf dieses Problem gestoßen bin. Was passiert, wenn ein Benutzer auf einen leeren Bereich des obersten Fragment
klickt, da sein ViewGroup
nicht anklickbar ist, wird das Ereignis von dem anklickbaren View
(dh Button
) gehandhabt bequem unter dem Finger des Benutzers platziert. Ich habe es behoben, indem ich die% Fragment
ViewGroup
klickbar gemacht habe. Damals habe ich nicht viel darüber nachgedacht, aber diese Lösung scheint ein bisschen "hacky".
Ich verstehe, dass es für ein View
normales Verhalten ist, das standardmäßig nicht klickbar ist, um Klickereignisse nicht abzufangen, aber man könnte meinen, dass eine große Verwendung für Fragments
darin besteht, die Ansichtshierarchie (eine Aufgabe) anzuzeigen getan durch die Activity
nur vorher), dass es einem Activity
in diesem Sinne ähnelt. Wenn eine Activity
die Intent
auslöst, um eine neue Activity
zu erstellen, und dann diese Activity
auf dem Bildschirm angezeigt wird, werden keine Klickereignisse an die zugrunde liegende Activity
geliefert. Ich weiß, dass ein Activity
viele Fragments
enthalten kann, die möglicherweise nicht den gesamten Bildschirm ausfüllen oder gar keine XML haben, aber manchmal sind Klickereignisse nur für die oberste Fragment
gedacht.
Bei allem, was gesagt wurde, hier kommen die Fragen:
1) Setzen Sie ViewGroup
auf die oberste Fragment
, um anklickbar zu sein, den besten Weg, dies zu lösen?
2) Gibt es dieses Feature und ich bin mir dessen nicht bewusst? Und wenn nicht, sollte es?
Ist das Einstellen der ViewGroup auf das oberste Fragment die beste Lösung?
Wenn Sie davon ausgehen, dass Ihre Benutzeroberfläche mit der Benutzeroberfläche der verknüpften Frage verwandt ist, wird die Benutzeroberfläche falsch geschrieben.
Ich nehme die UI von dieser Frage an, weil der Entwickler zwei Fragmente hat, A und B, von denen jedes den Bildschirm ausfüllt. A ist zunächst mit den drei Tasten unten zu sehen. Der Entwickler ruft dann add()
auf, um B anzuzeigen, wobei B einen undurchsichtigen schwarzen Hintergrund hat.
Das ist auf einigen Ebenen dumm. Sie stoßen nicht nur auf das Problem der Berührungsereignisse, sondern Sie haben Probleme überzeichnet, weil Android die Schaltflächen rendert und dann den schwarzen Hintergrund darüber rendert.
Die richtige Antwort ist hier B replace()
A zu haben.
(Ich merke, dass der Entwickler tatsächlich kein Fragment A hat, aber diese Widgets in der Aktivität hat, was der Benutzeroberfläche eine weitere Stufe der Skizzenhaftigkeit hinzufügt)
Ganz allgemein würde ich keine Fragmente oder irgendetwas anderes höher auf der Z-Achse haben mit der Absicht, darunterliegende Widgets zu verstecken. So ist es beispielsweise in Ordnung, einen Vollbildschirm VideoView
mit einem Popup MediaController
höher auf der Z-Achse zu haben, da Berührungsereignisse, die für den Controller bestimmt sind, vom Controller übernommen werden, der Benutzer jedoch trotzdem Tippen Sie auf Teile von VideoView
, die nicht vom Controller blockiert wurden. Umgekehrt würde ich einen Webbrowser mit Registerkarten nicht implementieren, indem ich ein WebView
ein anderes WebView
auf der Z-Achse überlagert - entweder wäre nur ein WebView
, oder es wäre nur eins sichtbar WebView
(wobei der andere aus der Ansichtshierarchie entfernt oder als View.GONE
markiert ist).
Wenn eine Aktivität die Absicht auslöst, eine neue Aktivität zu erstellen, und diese Aktivität auf dem Bildschirm angezeigt wird, werden keine Klickereignisse an die zugrunde liegende Aktivität übermittelt.
Dies liegt daran, dass es in Bezug auf die Ansichtshierarchie keine "zugrunde liegende Aktivität" gibt. Technisch gesehen ist jede Aktivität in ihrem eigenen Window
und selbst wenn der oberste Window
den Bildschirm nicht füllt (z. B. Dialog-Themen-Aktivität), ist die "zugrunde liegende Aktivität" sichtbar, kann aber keine Berührungsereignisse empfangen .
Ich stelle fest, dass eine Aktivität viele Fragmente enthalten kann, die nicht den gesamten Bildschirm ausfüllen können oder sogar kein xml haben, aber manchmal sind Klickereignisse nur für das oberste Fragment gedacht.
Dann sollte nichts unter "dem obersten Fragment" sein, IMHO. Verwenden Sie replace()
, nicht add()
, wenn Sie diese Art von UI-Switch verwenden. Oder verwenden Sie DialogFragment
, wenn Sie temporär etwas modales Übernehmen der Vordergrundeingabe haben möchten (da ein Dialog seine eigene Window
bekommt, wenn ich das richtig verstehe). Zeichnen Sie nicht nur einen soliden Hintergrund und tun Sie so, als ob andere Widgets, die jetzt übermalt sind, nicht existieren.
Existiert diese Funktion und ich bin mir dessen nicht bewusst?
Nein, weil Fragmente nicht ViewGroups
sind und daher nicht das Routing von Berührungsereignissen verwalten.
Und wenn nicht, sollte es?
IMHO, nein, aber Sie können gerne ein Problem dafür einreichen.
Tags und Links android android-fragments