Ответ 1
EDIT Синтезированная версия:
1) Объявите иерархическую структуру навигации вашего приложения в файле манифеста.
2) Корневая активность вашего приложения должна выполнять переключатель вида между TopViews в иерархии приложений. *
3) Действия ниже в иерархии должны выполнять навигацию "Selective Up".
* Важно: вы не должны добавлять транзакции в задний стек, когда транзакция предназначена для горизонтальной навигации, например, при переключении вкладок или вид сверху в верхнем ящике навигации.
Полное описание:
Вы должны избегать использования флажков Intent с новыми навигационными паттерами, такими как Navigation Drawer, по следующим причинам:
- Intent Flags на самом деле не 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) В вашей корневой деятельности выбор элемента ящика должен инициировать действие "view switch", заменив содержимое текущего фрагмента активности.
Переключатель вида следует тем же основным политикам, что и переключение списков или вкладок, поскольку переключатель просмотра не создает историю навигации. Этот шаблон следует использовать только в корневой деятельности задачи, оставляя активную навигацию вверх, чтобы продолжить деятельность по иерархии навигации (в вашем случае ниже 1.1 и ниже 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 позволяет пользователю переходить по иерархии навигации приложения по своему усмотрению. Приложение должно относиться к этому так, как оно обрабатывает навигацию 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();
}
работ:
http://developer.android.com/training/implementing-navigation/ancestral.html https://speakerdeck.com/jgilfelt/this-way-up-implementing-effective-navigation-on-android