Sollte es keine Option für Fragmente geben, um Klickereignisse in ihrer Ansichtshierarchie beizubehalten?

8

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?

    
Emmanuel 15.01.2014, 17:53
quelle

1 Antwort

7
  

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.

    
CommonsWare 16.01.2014, 18:12
quelle

Tags und Links