Подтвердить что ты не робот

Удаление и добавление действий в задний стек

В разделе "Система обратно после перекрестной навигации для более низких уровней иерархии" Навигационный ящик они говорят:

Если пользователь переходит к нижнему иерархическому экрану из навигации ящик и экран имеют прямой родительский элемент, тогда стек Back reset и Back указывает на целевые экраны родителя. Это Назад поведение такое же, как когда пользователь переходит в приложение из уведомление.

resetting the back stack

Я знаю, что задний стек может быть reset, запустив действие с FLAG_ACTIVITY_CLEAR_TOP и FLAG_ACTIVITY_NEW_TASK, но это, похоже, не может быть использовано здесь, так как это не создало бы задний стек для Lower 1.1.1.

Любая идея, как удалить TopView2 из стека и в то же время добавить верхний стек TopView1 → Lower 1.1 при запуске Lower 1.1.1? Я ожидаю простого решения, учитывая, что это упоминается в документе "Ящик навигации".

4b9b3361

Ответ 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