Управление бэкстеком в андроиде

В настоящее время структура приложения для Android

Home
   About us
   Products
     product1
     product2
     product3
   Contact us

Поскольку есть боковое меню, и я могу напрямую получить доступ к продукту 1, моя текущая попытка - добавить в стопку для каждой транзакции, и она ведет себя довольно странно.

Если я пойду так:

Home->product1->About us

Поток после того, как я захожу на домашнюю страницу, я нажимаю на продукт 1 в боковом меню, после входа на страницу продукта 1 нажимаю о нас в боковом меню.

1-й раз нажмите кнопку «Назад», он вернется к продукту 1, но он должен вернуться домой

2-й раз нажмите кнопку «Назад», он вернется на главную, но должен перейти на страницу «Продукты».

Как обращаться с бэкстеком в такой ситуации? Спасибо за помощь.


person user782104    schedule 07.01.2016    source источник


Ответы (2)


Вам нужно быть умным, когда вы изменяете фрагменты и popBackStack в нужное время, чтобы контролировать стек. Вот пример из одного из моих приложений (также обрабатывает повторное использование существующих фрагментов в стеке):

// Idea from http://stackoverflow.com/questions/18305945/how-to-resume-fragment-from-backstack-if-exists
private void setPrimaryContentFragment(BaseFragment fragment, boolean allowStack){
    final String backStackName = fragment.getBackStackName();

    final FragmentManager manager = getSupportFragmentManager();
    final boolean fragmentPopped = manager.popBackStackImmediate(backStackName, 0);

    if (!fragmentPopped) { //fragment not in back stack, create it.
        if (!allowStack && manager.getBackStackEntryCount() > 1) {
            manager.popBackStack(manager.getBackStackEntryAt(0).getId(), 0);
        }

        final FragmentTransaction transaction = manager.beginTransaction();
        transaction.replace(R.id.primary_content, fragment);
        transaction.addToBackStack(backStackName);
        transaction.commit();

        try {
            manager.executePendingTransactions();
        } catch (IllegalStateException exception) {
            // Move along as this will be resolved async
        }
    }
}

Метод getBackStack() реализован в моем базовом фрагменте и имеет реализацию по умолчанию:

public String getBackStackName() {
    return getClass().getName();
}

Флаг allowStack используется для контроля того, может ли быть более одной записи в заднем стеке.

Что касается вставки фрагмента продукта, когда пользователь переходит непосредственно на страницу сведений, вам, вероятно, потребуется сделать именно это. т. е. выполните замену для продуктов, а затем замену для сведений о продукте. Надеюсь, этот фрагмент кода и связанный пост помогут вам найти нужное решение.

person Cory Charlton    schedule 07.01.2016

Кнопка жесткого возврата всегда будет проходить через стек, что является ожидаемым поведением от ваших пользователей.

Если вы ищете что-то, что вернет вас к родительскому действию, например, возврат продукта X к родительскому экрану «Продукты», это то, что вы можете определить с помощью функций кнопки «Вверх». Навигация вверх с сайта Android Dev

Таким образом, вам не нужно пытаться очистить и управлять задним стеком, просто определите элементы, которые вернут пользователя на родительские экраны.

person Daniel Gruici    schedule 07.01.2016