Я вчусь використовувати фрагменти. У мене є три екземпляри 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|
___
Фактична:
| |
|B|
|B|
|A|
___
Чи повинен я перекрити onBackPressed()
будь-яку настройку чи мені щось не вистачає?