Android backstack ведет себя странно
Мое приложение в настоящее время имеет одну активность и несколько фрагментов. Я хочу, чтобы когда пользователь нажимал кнопку "Назад" на своем телефоне, он перемещался назад через пользовательский интерфейс вместо выхода из приложения.
Я перезаписываю onBackPressed() в моей основной деятельности...
@Override
public void onBackPressed() {
FragmentManager fragmentManager = getSupportFragmentManager();
if (fragmentManager.getBackStackEntryCount() > 1) {
fragmentManager.popBackStackImmediate();
} else if(fragmentManager.findFragmentByTag("Seizure Tracker").isVisible()) {
if (backButtonPressed + 3000 > System.currentTimeMillis())
super.onBackPressed();
else {
backButtonPressed = System.currentTimeMillis();
Toast.makeText(this, "Press back again to exit.", Toast.LENGTH_SHORT).show();
}
} else{
super.onBackPressed();
}
}
Кажется, это работает нормально, за исключением одного перехода. В основном я двигаюсь от фрагмента A -> B -> C, нажимаю назад и фрагмент A обнаруживается. Нажмите еще раз, и вместо сообщения "Нажмите еще раз, чтобы выйти" ничего не происходит. Нажмите еще раз, и появится сообщение.
Если я пойду
A -> B -> C back (now at A) -> B -> C back
Я оказываюсь в B. Если я снова нажимаю, я остаюсь в B. Нажмите снова, и я добираюсь до A. Нажмите снова, и появляется сообщение "Нажмите еще раз, чтобы выйти".
Если я пойду
A -> B -> C -> D back (now at C) back
Я в конечном итоге в том же состоянии, как если бы я вернулся A -> B -> C. Так что в основном D обратно в C работает нормально, как и любой другой обратный переход.
В моей основной деятельности у меня есть прослушиватель, когда меняется состояние спины, чтобы я мог обновить actionBar
getSupportFragmentManager().addOnBackStackChangedListener(
new FragmentManager.OnBackStackChangedListener() {
public void onBackStackChanged() {
FragmentManager fragmentManager = getSupportFragmentManager();
System.out.println("changed: "+fragmentManager.getBackStackEntryCount());
for(int i = 0; i < fragmentManager.getBackStackEntryCount(); i++)
System.out.println("name: "+fragmentManager.getBackStackEntryAt(i).getName());
// Update your UI here.
getSupportActionBar().setTitle(getSupportFragmentManager()
.findFragmentById(R.id.container).getTag());
}
});
Это обновляет actionBar, как если бы задние переходы работали как задумано. Я также добавил строки для печати, и они говорят мне, что обратные переходы работают как задумано, и я не вижу ничего странного в печати:
for(int i = 0; i < fragmentManager.getBackStackEntryCount(); i++)
System.out.println("name:"+fragmentManager.getBackStackEntryAt(i).getName());
Я использую NavigationDrawer, может быть, это как-то влияет на это...
switch (position) {
case 0:
fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
System.out.println(fragmentManager.getBackStackEntryCount());
fragmentManager.beginTransaction()
.add(R.id.container, new SeizureTrackerFragment(), "Seizure Tracker")
.commit();
break;
case 2:
fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
fragmentManager.beginTransaction()
.add(R.id.container, new SetupFragment(), "Setup")
.commit();
break;
case 3:
fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
fragmentManager.beginTransaction()
.add(R.id.container, new AboutFragment(), "About")
.commit();
break;
}
Если я начну с любого из других фрагментов, кроме "случая 0", все работает нормально.
Я всегда перехожу, используя один и тот же код:
fragmentManager.beginTransaction()
.add(R.id.container, new AnalyzeFragment(), "Analyze")
.addToBackStack("Analyze").commit();
Мой фрагмент onCreate() все выглядит одинаково:
View view;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
AppCompatActivity activity = (AppCompatActivity) getActivity();
ActionBar actionBar = activity.getSupportActionBar();
actionBar.setTitle("Analyze");
if(view == null)
view = inflater.inflate(R.layout.fragment_analyze, container, false);
return view;
}
Просто чтобы сделать эту проблему немного более запутанной, время от времени она будет случайным образом работать идеально, даже когда я абсолютно ничего не изменяю в своем коде.