2013-02-11 3 views
1

Я делаю приложение, которое в определенном FragmentActivity имеет Tabhost хостинг 2 фрагмента. Один из них должен иметь либо макет A, либо вверх, либо макет B, а другой - тот же макет.Восстановить внутренний фрагмент

  • FragmentActivity
    • Fragment1 (первая закладка)
      • LayoutA
      • LayoutB
    • FRAGMENT2 (вторая закладка)
      • LayoutC

Для того, чтобы обернуть контроль обеих раскладок в отдельных модулях, я сделал два фрагмента, а именно Fragmenta и FragmentB, которые используют LayoutA и LayoutB соответственно, что делает деятельность выглядеть следующим образом:

  • FragmentActivity
    • Fragment1 (первая закладка)
      • Fragmenta
        • LayoutA
      • FragmentB
        • LayoutB
    • FRAGMENT2 (вторая закладка)
      • LayoutC

У меня есть проблема в том, что я не могу сделать это устойчивое против обоих:

  • пользователь покидает приложение, когда первая закладка показана
  • пользователь переходит на вкладку 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.

Примечание: я установил все фрагменты, чтобы сохранить их состояние.

ответ

0

Решенный! Я использовал второй код. Я должен был выполнить эту последовательность шагов внутри onStart: - отсоединить фрагмент - добавить его в новый вид - приложить его

Смежные вопросы