Прежде всего, я знаю, что я могу сохранить один фрагмент с 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);
}
Спасибо так много!