Kontextmenü in Fragment verwendet ListView von einem anderen Fragment: registerForContextMenu (getListView ())

9

Ich habe versucht, nach Lösungen dafür zu suchen, aber habe nichts gefunden, was zu meiner Situation passt. Ich habe eine MainActivity, die FragmentActivity und mehrere ListFragments erweitert. Ich verwende die PagerSlidingTabStrip-Bibliothek für Schieberegler und einen ViewPager. Fragmente haben kein XML-Layout, sie sind nur ListFragments, die ein ListView zurückgibt, so dass ein Layout nicht benötigt wurde.

Es ist eine Soundboard-App, bei der lange auf ein Listenelement gedrückt wird, mit dem der Benutzer eine Audiodatei als Klingelton, Benachrichtigung oder Alarm einstellen oder auf SD-Karte speichern kann.

Nun laden alle Fragmente ihre eigenen Daten gut. Alles scheint in Ordnung zu sein, aber wenn ich das Kontextmenü eines Fragments verwende, das im Hintergrund geladen wurde, scheint es die ListView aus dem ersten oder vorherigen Fragment zu verwenden, das davor geladen wurde, das beim Erstellen sichtbar war .

Was ich meine, ist, dass meine MainActivity startet, lädt FragmentA, und im Hintergrund wird FragmentB ebenfalls geladen.

In der onActivityCreated-Methode wird für beide Fragmente registerForContextMenu (getListView ()) verwendet.

%Vor%

Es scheint aber so zu sein, dass FragmentB registerForContextMenu (getListView ()) aufruft und scheinbar das gerade aktive ListView übernimmt, welches die Liste für FragmentA ist.

Sagen wir also, ich möchte eine Datei aus dem Kontextmenü speichern. Ich drücke lange auf das erste Element von FragmentB, aber es versucht, das erste Element von FragmentA zu speichern. Wenn ich nur auf das Listenelement tippe, spielt es seinen eigenen Sound, wie man es erwarten würde, aber Kontextmenübefehle verwenden die Liste des Fragments, das sichtbar war, als es vorinstalliert war.

Hier ist das onCreateContextMenu. Beachten Sie, dass an dieser Stelle der korrekte Eintrag Titel im Kontextmenü Titel verwendet wird.

%Vor%

Und hier ist die onContextItemSelected.

%Vor%

Dies funktioniert alles wie erwartet, abgesehen von der Tatsache, dass vorgeladene Fragmente die falsche ListView verwenden.

Was ich suche, ist also eine Möglichkeit, um sicherzustellen, dass FragmentB im Hintergrund geladen wird, während ein anderes Fragment aktiv ist. FragmentB sollte sein eigenes ListView für das Kontextmenü registrieren und nicht das, was in der ListView der Aktivität passiert ist um zu der Zeit sichtbar zu sein.

Ich habe versucht, MyFragment.this.getListView () zu verwenden, und ich habe versucht, mit der Methode setUserVisibleHint, aber diese haben nicht geholfen. Ich habe versucht, das RegisterForContextMenu (getListView ()) in onResume, in der Hoffnung, es würde die korrekte ListView neu registrieren, wenn das Fragment aktiv wurde.

Jede Hilfe würde sehr geschätzt, danke!

    
Orcrist666 02.08.2014, 15:21
quelle

1 Antwort

14

Ich habe es endlich herausgefunden!

Es stellte sich heraus, dass es nicht nur das Kontextmenü für die falsche ListView aufgerufen hat, das Kontextmenü wurde für ALLE Fragmente aufgerufen.

Dies wurde gelöst, indem getUserVisibleHint () in einer if-Anweisung innerhalb der onContextItemSelected-Methode verwendet wurde. Wenn das Fragment, für das das Kontextmenü aufgerufen wurde, nicht sichtbar war, würde es false zurückgeben, aber wenn es das aktuell sichtbare Fragment war würde den richtigen Code ausführen, dh Fragmente überspringt, die nicht das beabsichtigte Fragment sind. Ich hatte getUserVisibleHint () bereits auf andere Weise versucht, aber ich dachte damals nicht über das Problem im rechten Winkel nach.

Hier ist ein Beispiel für die Lösung.

%Vor%     
Orcrist666 04.08.2014, 19:42
quelle