Ich habe Tabs in der ActionBar, die ich wie folgt aufbaue:
public void onCreate(Bundle b){
setContentView(R.layout.main_activity);
final Tab tab = getActionBar().newTab();
tab.setText("Tab 1");
tab.setTabListener(new TabListener<T>(new Tab1Fragment()));
getActionBar().addTab(tab);
tab.setText("Tab 2");
tab.setTabListener(new TabListener<T>(new Tab2Fragment()));
getActionBar().addTab(tab);
}
private static final class TabListener<T extends Fragment> implements ActionBar.TabListener {
private final T fragment;
public TabListener(final T fragment) {this.fragment = fragment;}
public void onTabSelected(final Tab tab, final FragmentTransaction ft) {ft.replace(R.id.tab_target, this.fragment, null);}
public void onTabUnselected(final Tab tab, final FragmentTransaction ft) {}
public void onTabReselected(final Tab tab, final FragmentTransaction ft) {}
}
}```Das Funktioniert auch alles wunderbar.
"Problem" scheint zu sein, dass ich in `Tab1Fragment` ein weiteres Fragment habe, dass `retain = true` ist:
```public class Tab1Fragment extends Fragment{
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle b) {
return inflater.inflate(R.layout.tab_1_fragment, null);
}
public void onActivityCreated(Bundle b){
MyRetainFragment retainFrag = (MyRetainFragment) getFragmentManager().findFragmentByTag("my_frag");
if (retainFrag == null) {
retainFrag = new MyRetainFragment(); // retain = true im Konstruktor
}
getFragmentManager().beginTransaction().replace(R.id.retain_target, retainFrag, "my_frag").commit(); // HIER KNALLTS ! (Vermutlich)
}
}```
Die verwendeten Layouts sind:
**main_activity.xml**
[xml]<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" >
<LinearLayout android:id="@+id/tab_target"/>
</RelativeLayout>[/xml]
**tab_1_fragment.xml**
[xml]<TableLayout xmlns:android="http://schemas.android.com/apk/res/android">
<TableRow>
<LinearLayout android:id="@+id/retain_target"/> <!-- Hier soll das Retain-Fragment rein! -->
</TableRow>
</TableLayout>[/xml]
Die Fehlermeldung:
11-07 16:33:03.804: E/AndroidRuntime(10895): Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f0a0024 for fragment MyRetainFragment{41fb88a0 #1 id=0x7f0a0024 retain_target}
11-07 16:33:03.804: E/AndroidRuntime(10895): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:823)
11-07 16:33:03.804: E/AndroidRuntime(10895): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035)
11-07 16:33:03.804: E/AndroidRuntime(10895): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1017)
11-07 16:33:03.804: E/AndroidRuntime(10895): at android.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1806)
11-07 16:33:03.804: E/AndroidRuntime(10895): at android.app.Activity.performCreate(Activity.java:5166)
11-07 16:33:03.804: E/AndroidRuntime(10895): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
11-07 16:33:03.804: E/AndroidRuntime(10895): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2061)
11-07 16:33:03.804: E/AndroidRuntime(10895): … 12 more
Beim starten geht alles gut. Drehe ich das Tablet in Tab1, verschwindet der gesamt Content. Wechsle ich auf Tab2 und drehe das Tablet, kommt dieser Fehler.
Mir siehts so aus, als würde er die ID `retain_target` nicht finden. Aber zu dem Zeitpunkt sollte das Tab1Fragment doch schon in der Activity hängen, so dass der FragmentManager die id finden sollte!? Bin verwirrt.