Я делаю приложение, которое в определенном FragmentActivity имеет Tabhost хостинг 2 фрагмента. Один из них должен иметь либо макет A, либо вверх, либо макет B, а другой - тот же макет.Восстановить внутренний фрагмент
- FragmentActivity
- Fragment1 (первая закладка)
- LayoutA
- LayoutB
- FRAGMENT2 (вторая закладка)
- LayoutC
- Fragment1 (первая закладка)
Для того, чтобы обернуть контроль обеих раскладок в отдельных модулях, я сделал два фрагмента, а именно Fragmenta и FragmentB, которые используют LayoutA и LayoutB соответственно, что делает деятельность выглядеть следующим образом:
- FragmentActivity
- Fragment1 (первая закладка)
- Fragmenta
- LayoutA
- FragmentB
- LayoutB
- Fragmenta
- FRAGMENT2 (вторая закладка)
- LayoutC
- 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 я бэр ove фрагмент, чтобы прикрепить его к новому FrameLayout, созданному в OnCreateView, когда фрагмент перезапустится в следующий раз. Проблема с этим кодом заключается в том, что, по-видимому, я не могу совершать транзакции, когда пользователь покидает приложение, поэтому он сбой.
java.lang.RuntimeException: Unable to stop activity {my.package/my.package.MainTabHost}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
Чтобы решить эту проблему, я изменил удаление фрагмента, прежде чем я пытаюсь добавить его в FragmentTransaction в OnStart:
@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();
}
Этот код имеет другую проблему. Переход от первой вкладки ко второй, а затем возврат к первому показывает пустой макет для Fragment1.
Примечание: я установил все фрагменты, чтобы сохранить их состояние.