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.