2016-11-16 5 views
0

Прежде всего, я знаю, что я могу сохранить один фрагмент с setRetainInstance(true); и получить от FragmentManager, когда savedInstanceState.Сохранять несколько фрагментов при повороте экрана

Но моя ситуация в том, что у меня есть три фрагмента в моей деятельности, которые я «обмениваю» с помощью транзакции, в зависимости от действий пользователя. Я также могу воссоздать текущий фрагмент, сохранив флаг в пределах onSaveInstanceState(Bundle savedInstanceState), чтобы восстановить его, когда пользователь поворачивает экран.

Моя проблема возникает, когда пользователь поворачивает экран, находясь в одном фрагменте, а затем щелкните, чтобы перейти к предыдущему фрагменту. Поскольку единственный фрагмент, который я могу восстановить, является активным фрагментом, я не могу показать предыдущий фрагмент, не повторяя его (потеряв всю информацию, которую я имел).

Вот мой код. Кроме того, если это не является хорошим решением, я бы оценил любые советы.

private Fragment1 fragment1; 
private Fragment2 fragment2; 
private Fragment3 fragment3; 
private String currentFragmentTAG; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_weight); 

    ... 

    mFragmentManager = getSupportFragmentManager(); 

    if (savedInstanceState != null) { 
     // HOW TO RECOVER ALL FRAGMENTS?? 
     fragment1 = ??; 
     fragment2 = ??; 
     fragment3 = ??; 

     String tag = savedInstanceState.getString(SAVED_FRAGMENT); 
     Fragment savedFragment = mFragmentManager.findFragmentByTag(tag); 
     replaceFragment(savedFragment, tag, null); 
    } 
} 

// Here, in other funcions, I initialize fragments and show one of them depending of user actions 
// I use replaceFragment function to "swap" fragments. 

private void replaceFragment(Fragment fragment, String tag, Map<String, Parcelable> objectsToBundle) { 
    if (fragment != null && !tag.equals(currentFragmentTAG)) { 
     FragmentTransaction mFragmentTransaction = mFragmentManager.beginTransaction(); 

     if (objectsToBundle != null && !objectsToBundle.isEmpty()) { 
      Bundle bundle = new Bundle(); 

      for (Map.Entry<String, Parcelable> entry : objectsToBundle.entrySet()) { 
       bundle.putParcelable(entry.getKey(), entry.getValue()); 
      } 

      fragment.setArguments(bundle); 
     } 

     mFragmentTransaction.replace(R.id.fragment_weight_container, fragment, tag); 
     mFragmentTransaction.commit(); 

     currentFragmentTAG = tag; 
    } 
} 

В моих фрагментов я использую setRetainInstance(true)

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    // retain this fragment 
    setRetainInstance(true); 
} 

Спасибо так много!

ответ

0

Решение было довольно простым. Мне просто нужно использовать FragmentTransaction.addToBackStack(tag) при выполнении транзакции в моей функции replaceFragment. Таким образом, все фрагменты использовали в своей деятельности будет retaines и может быть извлечена из FragmentManager

... 
FragmentTransaction mFragmentTransaction = mFragmentManager.beginTransaction(); 
mFragmentTransaction.addToBackStack(tag); 
... 

Так что это, как я могу восстановить их (если уже экземпляр)

if (savedInstanceState != null) { 
    mWeightMainFragment = (WeightMainFragment) mFragmentManager.findFragmentByTag(WeightMainFragment.TAG); 
    mWeightAddFragment = (WeightAddFragment) mFragmentManager.findFragmentByTag(WeightAddFragment.TAG); 
    mWeightChartFragment = (WeightChartFragment) mFragmentManager.findFragmentByTag(WeightChartFragment.TAG); 

    currentFragmentTAG = savedInstanceState.getString(SAVED_FRAGMENT); 
    Fragment savedFragment = mFragmentManager.findFragmentByTag(currentFragmentTAG); 
    replaceFragment(savedFragment, currentFragmentTAG, null); 
} 

Bonus: Я также использую popBackStack(), чтобы отменить транзакции вместо замены фрагмента заднего стека.

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