Я изучаю, как использовать фрагменты. У меня есть три экземпляра Fragment
, которые инициализируются в верхней части класса. Я добавляю фрагмент к следующему действию:
Объявление и инициализация:
Fragment A = new AFragment();
Fragment B = new BFragment();
Fragment C = new CFragment();
Замена/Добавление:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, A);
ft.addToBackStack(null);
ft.commit();
Эти фрагменты работают исправно. Каждый фрагмент привязан к действию и без проблем сохраняется в фоновом стеке.
Поэтому, когда я запускаю A
, C
, а затем B
, стек выглядит следующим образом:
| |
|B|
|C|
|A|
___
И когда я нажимаю кнопку "назад", B
уничтожается и C
возобновляется.
Но, когда я запускаю фрагмент A
во второй раз, вместо возобновления из заднего стека, он добавляется в верхнюю часть заднего стека
| |
|A|
|C|
|A|
___
Но я хочу возобновить A
и уничтожить все фрагменты поверх него (если есть). На самом деле, мне нравится поведение по умолчанию в фоновом режиме.
Как это сделать?
Ожидается: (A
должно быть возобновлено, а верхние фрагменты должны быть уничтожены)
| |
| |
| |
|A|
___
Изменить: (предложенный A-C)
Это мой код:
private void selectItem(int position) {
Fragment problemSearch = null, problemStatistics = null;
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
String backStateName = null;
Fragment fragmentName = null;
boolean fragmentPopped = false;
switch (position) {
case 0:
fragmentName = profile;
break;
case 1:
fragmentName = submissionStatistics;
break;
case 2:
fragmentName = solvedProblemLevel;
break;
case 3:
fragmentName = latestSubmissions;
break;
case 4:
fragmentName = CPExercise;
break;
case 5:
Bundle bundle = new Bundle();
bundle.putInt("problem_no", problemNo);
problemSearch = new ProblemWebView();
problemSearch.setArguments(bundle);
fragmentName = problemSearch;
break;
case 6:
fragmentName = rankList;
break;
case 7:
fragmentName = liveSubmissions;
break;
case 8:
Bundle bundles = new Bundle();
bundles.putInt("problem_no", problemNo);
problemStatistics = new ProblemStatistics();
problemStatistics.setArguments(bundles);
fragmentName = problemStatistics;
default:
break;
}
backStateName = fragmentName.getClass().getName();
fragmentPopped = manager.popBackStackImmediate(backStateName, 0);
if (!fragmentPopped) {
ft.replace(R.id.content_frame, fragmentName);
}
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack(backStateName);
ft.commit();
// I am using drawer layout
mDrawerList.setItemChecked(position, true);
setTitle(title[position]);
mDrawerLayout.closeDrawer(mDrawerList);
}
Проблема заключается в том, что при запуске A
и затем B
, затем нажмите 'назад', B
будет удалено и A
будет возобновлено. и нажатие "назад" второй раз должно выйти из приложения. Но он показывает пустое окно, и я должен вернуться в третий раз, чтобы закрыть его.
Кроме того, когда я запускаю A
, тогда B
, затем C
, затем B
снова...
Ожидаемое:
| |
| |
|B|
|A|
___
Actual:
| |
|B|
|B|
|A|
___
Должен ли я переопределить onBackPressed()
с любой настройкой или я что-то пропустил?