17 Stimmen

Fragmente in der Aktionsleiste Tab-Fragmente?

Können Sie Fragmente innerhalb des Fragments für eine Registerkarte in der Aktionsleiste einfügen?

Ich habe eine Android (3.0/Honeycomb) Anwendung mit einer Hauptaktivität, die eine Aktionsleiste mit 3 Registerkarten hat. Die Registerkarten werden in der onCreate()-Methode meiner Aktivität hinzugefügt, und die Registerkartenfragmente werden mit einem TabListener hinzugefügt/entfernt. Der Code ist fast identisch mit dem Beispiel unter http://developer.Android.com/guide/topics/ui/actionbar.html#Tabs .

Der TabListener sieht wie folgt aus:

public class SwapOutTabListener implements ActionBar.TabListener {
    public SwapOutTabListener(Fragment fragment) {
        _fragment = fragment;
    }

    @Override
    public void onTabSelected(Tab tab, FragmentTransaction ft) {
        ft.add(R.id.fragment_container, _fragment, null);
    }

    @Override
    public void onTabUnselected(Tab tab, FragmentTransaction ft) {
        ft.remove(_fragment);
    }

    @Override
    public void onTabReselected(Tab tab, FragmentTransaction ft) {
        // do nothing
    }

    private Fragment _fragment;
}

Zwei meiner Registerkarten sind einfache Fragmente, sie enthalten nur eine einzelne TextView in ihnen, etwa so (die meisten Attribute entfernt für Klarheit):

<LinearLayout>
    <TextView android:text="Tab 1" />
</LinearLayout>

Aber das Fragment für eine meiner Registerkarten ist komplizierter, und enthält zwei eingebettete Fragmente, etwa so:

<LinearLayout>
    <fragment
        android:name="...Fragment_1"
        android:id="@+id/frag1"
    />
    <fragment
        android:name="...Fragment_2"
        android:id="@+id/frag2"
    />
</LinearLayout>

Wenn der Benutzer die Registerkarte für dieses Fragment auswählt, werden alle Methoden des Startlebenszyklus (onStart(), onResume()) für alle drei Fragmente (das Registerkartenfragment und die beiden eingebetteten Fragmente) aufgerufen.

Wenn der Benutzer dann aber eine andere Registerkarte auswählt, erhält nur das Registerkartenfragment eine der End-of-Lifecycle-Methoden (onPause(), onStop() usw.). Die beiden eingebetteten Fragmente erhalten nie einen dieser Aufrufe und werden nie beendet.

Dies führt zu Problemen, wenn die Registerkarte erneut ausgewählt wird, da sich die Laufzeit beim Laden des Registerkartenfragments über eine doppelte Fragment-ID beschwert:

Binary XML file line #7: Duplicate id 0x7f05000a, tag null, or parent id 0x7f050009 with another fragment for ...Fragment_1

Ist es meine Aufgabe, diese eingebetteten Fragmente zu entfernen, wenn das Tab-Fragment entfernt wird? Wenn ja, wann genau muss ich das tun?

0 Stimmen

Könnten Sie Ihren TabListener-Code posten, der den Tabwechsel durchführt? Sind auch die doppelten android:id="@+id/frag2" Zeilen oben absichtlich oder nur ein Schreibfehler in der hier gestellten Frage?

0 Stimmen

@adamp, ja, die doppelten IDs waren ein Schreibfehler... Ich habe die Frage bearbeitet, um das zu korrigieren. Ich habe auch meinen TabListener-Code zur Frage hinzugefügt.

19voto

hackbod Punkte 89543

Nein, Fragmente befinden sich derzeit nicht in einer Hierarchie. Ich habe mir überlegt, dies zu tun, aber zum jetzigen Zeitpunkt wurden alle Anwendungsfälle dafür hauptsächlich durch eine extreme Überbeanspruchung von Fragmenten angetrieben, bei der jedes einzelne UI-Element als Fragment implementiert wird. Das ist nicht die Art und Weise, wie sie verwendet werden sollen, sie sind dazu gedacht, die wichtigsten Teile einer Anwendung auf oberster Ebene zu kapseln. Wenn Sie eine Hierarchie von Dingen haben, dann sind Ihr Layout und Ihre Ansichten dafür da.

1voto

Johnny Z Punkte 12470

Ahhhh. Das Gefühl der Erkenntnis. Ich habe gerade dies gefunden - "Hinweis: Sie können ein Layout nicht in ein Fragment aufblasen, wenn dieses Layout ein . Verschachtelte Fragmente werden nur unterstützt, wenn sie dynamisch zu einem Fragment hinzugefügt werden."

http://developer.Android.com/about/versions/Android-4.2.html#NestedFragments

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X