У меня есть несколько страниц/фрагментов, перечисленных в моем навигационном ящике, пользователь, вероятно, будет переключаться между ними часто, и я хочу, чтобы они были в backstack, чтобы они могли перемещаться назад, но мне нужен только один экземпляр каждого фрагмента в backstack, так что пользователю не нужно нажимать безумное количество раз, чтобы выйти из приложения. Я не могу понять, как эффективно "переупорядочить" стопку "без удаления страниц.
В настоящее время, когда я меняю страницу, я использовал этот код, чтобы изменить фрагмент и убедиться, что он только в обратном стеке один раз
if (mFragMgr == null) {
mFragMgr = getSupportFragmentManager();
}
String backStateName = fragmentDescriptor.name();
boolean fragmentPopped = mFragMgr.popBackStackImmediate(backStateName, 0);
if (!fragmentPopped){
mFragMgr.beginTransaction()
.remove((Fragment) mFragment)
.replace(R.id.content_frame, (Fragment) mFragment)
.addToBackStack(backStateName)
.commit();
}
Я использую этот код в onBackPressed
@Override
public void onBackPressed() {
if (mFragMgr.getBackStackEntryCount() > 0) {
mFragMgr.popBackStackImmediate();
} else {
super.onBackPressed();
}
}
Это работает, но это означает, что он удаляет страницы, которые я не хочу удалить. Пример:
Когда мой пользователь посещает 6 страниц в порядке A > B > C > D > E > C
, потому что я делаю удаление, я ожидал следующий стек:
[E] [C]
[D] [D] [E]
[C] [C] [C] [D]
[B] [B] [B] [B] [B]
[A] -> [A] -> [A] -> [A] -> [A] -> [A]
Но то, что я на самом деле получаю, следующее: оно всплывает до элемента, который соответствует имени, это независимо от того, включаю ли я ".remove((Fragment) mFragment)" или нет - (я уже теперь понял, что удаление не влияет на backstack, поэтому не нужно указывать на это):
[E]
[D] [D]
[C] [C] [C] [C]
[B] [B] [B] [B] [B]
[A] -> [A] -> [A] -> [A] -> [A] -> [A]
Если я не использую имя и вместо этого использую null при добавлении в backstack, я получаю следующее:
[C]
[E] [E]
[D] [D] [D]
[C] [C] [C] [C]
[B] [B] [B] [B] [B]
[A] -> [A] -> [A] -> [A] -> [A] -> [A]
Как я могу получить поведение, которое я ожидаю? Возможно ли вообще, или мне придется записывать изменения самостоятельно и вообще пропускать заднюю часть?