Удаление и добавление действий в задний стек
В разделе "Система после перекрестной навигации к нижним уровням иерархии" в Навигаторе навигации они говорят:
Если пользователь переходит к экрану более низкой иерархии из панели навигации, и у экрана есть прямой родитель, то стек Back сбрасывается, и Back указывает на родительский экран целевого экрана. Поведение "Назад" такое же, как и при переходе пользователя в приложение из уведомления.
Я знаю, что задний стек можно сбросить, запустив действие с FLAG_ACTIVITY_CLEAR_TOP и FLAG_ACTIVITY_NEW_TASK, но здесь это не представляется возможным, так как это не создаст задний стек для Lower 1.1.1.
Любая идея, как удалить TopView2 из стека и в то же время добавить BackView1 -> Lower 1.1 back stack при запуске Lower 1.1.1? Я ожидаю простое решение, учитывая, что это упомянуто в документе "Ящик навигации".
1 ответ
РЕДАКТИРОВАТЬ Синтезированная версия:
1) Объявите иерархическую структуру навигации вашего приложения в файле манифеста.
2) Корневая активность вашего приложения должна выполнять переключение представлений между TopViews в иерархии вашего приложения.*
3) Действия ниже в иерархии должны выполнять навигацию "Выборочное повышение".
*Важно: не следует добавлять транзакции в задний стек, если транзакция предназначена для горизонтальной навигации, например, при переключении вкладок или видов сверху панели навигации.
Полное описание:
Вам следует избегать использования Intent Flags с новыми навигационными шаблонами, такими как Navigation Drawer, по следующим причинам:
- Намеренные флаги на самом деле не являются API.
- Некоторые флаги работают только в точных комбинациях.
- Многие флаги не имеют отношения к большинству сторонних приложений.
- Перекрытие / конфликт с деятельностью
launchMode
, - Запутанная документация.
- Реализация может стать процессом проб и ошибок.
Вместо этого выберите новый API навигации:
- Native Up навигация для Jelly Bean и выше.
- На основе иерархических метаданных, указанных для каждого
<activity>
в вашем манифесте. - Библиотека поддержки обеспечивает эквивалентную функциональность для более ранних версий Android через
NavUtils
, TaskStackBuilder
предлагает дополнительные утилиты для навигации между задачами.
Итак, чтобы ответить на ваш вопрос, общая идея такова:
1) Вам необходимо объявить логического родителя каждого действия в файле манифеста, используя android:parentActivityName
атрибут (и соответствующий <meta-data>
элемент) как:
<application ... >
...
<!-- The main/home activity (it has no parent activity) -->
<activity
android:name="com.example.myapp.RootDrawerActivity" ...>
...
</activity>
<!-- A child of the root activity -->
<activity
android:name="com.example.myapp.Lower11 "
android:label="@string/lower11"
android:parentActivityName="com.example.myapp.RootDrawerActivity" >
<!-- Parent activity meta-data to support 4.0 and lower -->
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.myapp.RootDrawerActivity" />
</activity>
<activity
android:name="com.example.myapp.Lower111 "
android:label="@string/lower111"
android:parentActivityName="com.example.myapp.Lower11" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.myapp.Lower11" />
</activity>
</application>
2) В вашей корневой активности выбор элемента ящика должен инициировать действие "переключение вида" путем замены текущего содержимого фрагмента действия.
Переключатель представления следует тем же основным политикам, что и навигация по списку или вкладке, поскольку переключатель представления не создает историю навигации. Этот шаблон следует использовать только в корневом действии задачи, оставляя активным некоторую форму навигации вверх для действий далее вниз по иерархии навигации (в вашем случае Lower 1.1 и Lower 1.1.1). Важным моментом здесь является то, что вам не нужно удалять TopView2 из стека, а выполнять переключение представления в соответствии с комментариями перед передачей позиции представления (или идентификатора фрагмента) в качестве дополнительного.
В своей корневой активности сделайте что-то вроде этого:
@Override
protected void onDrawerItemSelected(int position) {
// Update the main content by replacing fragments
CategoryFragment fragment = new CategoryFragment();
Bundle args = new Bundle();
args.putInt(RootDrawerActivity.ARG_SORT, position);
fragment.setArguments(args);
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment).commit();
// Update selected item and title, then close the drawer
setDrawerItemChecked(position, true);
setTitle(getResources().getStringArray(R.array.drawer_array)[position]);
closeDrawer();
}
3) Затем, ниже по иерархии (т. Е. Lower1.1), вы должны выполнить навигацию Selective Up, воссоздав стек задач в процессе.
Selective Up позволяет пользователю переходить по иерархии навигации приложения по желанию. Приложение должно обрабатывать это так же, как оно обрабатывает навигацию Up из другой задачи, заменяя текущий стек задач (это то, что вам нужно!) С помощью TaskStackBuilder или аналогичного. Это единственная форма навигационной панели, которую следует использовать вне корневого действия задачи.
@Override
protected void onDrawerItemSelected(int position) {
TaskStackBuilder.create(this)
.addParentStack(RootDrawerActivity.class)
.addNextIntent(new Intent(this, RootDrawerActivity.class)
.putExtra(RootDrawerActivity.ARG_SORT, position))
.startActivities();
}
Refs:
http://developer.android.com/training/implementing-navigation/ancestral.html https://speakerdeck.com/jgilfelt/this-way-up-implementing-effective-navigation-on-android