特定の FragmentActivity に 2 つの Fragments をホストする Tabhost があるアプリを作成しています。そのうちの 1 つはレイアウト A が表示されているか、レイアウト B が表示されている必要があり、もう 1 つは常に同じレイアウトになっています。
- フラグメント アクティビティ
- Fragment1 (最初のタブ)
- レイアウトA
- レイアウトB
- Fragment2 (2 番目のタブ)
- レイアウトC
- Fragment1 (最初のタブ)
両方のレイアウトのコントロールを別々のモジュールにラップするために、それぞれ LayoutA と LayoutB を使用する FragmentA と FragmentB という 2 つの Fragment を作成し、アクティビティを次のようにします。
- フラグメント アクティビティ
- Fragment1 (最初のタブ)
- フラグメントA
- レイアウトA
- フラグメントB
- レイアウトB
- フラグメントA
- Fragment2 (2 番目のタブ)
- レイアウトC
- Fragment1 (最初のタブ)
私が抱えている問題は、これを両方に対して安定させることができないことです:
- 最初のタブが表示されたときにユーザーがアプリを離れた
- ユーザーがタブ 2 に移動してから、タブ 1 に戻る
最初、Fragment1 のコードは次のようになりました。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = new FrameLayout(getActivity());
view.setId(1);
return view;
}
@Override
public void onStart() {
super.onStart();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.add(1, mCurrentFragment, "f1");
ft.commit();
}
@Override
public void onStop() {
super.onStop();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.remove(mCurrentFragment);
ft.commit();
}
onStop 内では、フラグメントが次回再起動したときに、OnCreateView で作成された新しい FrameLayout にフラグメントをアタッチするために、フラグメントを削除します。このコードの問題は、ユーザーがアプリを離れたときにトランザクションを実行できないように見えるため、クラッシュすることです。
java.lang.RuntimeException: Unable to stop activity {my.package/my.package.MainTabHost}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
この問題を解決するために、onStart の FragmentTransaction にフラグメントを追加する直前に、フラグメントの削除を変更しました。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = new FrameLayout(getActivity());
view.setId(1);
return view;
}
@Override
public void onStart() {
super.onStart();
FragmentTransaction ft = getFragmentManager().beginTransaction();
if(getFragmentManager().findFragmentByTag("f1") != null) {
ft.remove(mCurrentFragment);
}
ft.add(1, mCurrentFragment, "f1");
ft.commit();
}
このコードには別の問題があります。最初のタブから 2 番目のタブに切り替えてから最初のタブに戻ると、Fragment1 の空白のレイアウトが表示されます。
注: すべてのフラグメントをその状態を保持するように設定しました。