Що означає addToBackStack з нульовим параметром?


93

У мене є код клієнта. Існує лише одна діяльність для всіх фрагментів, тобто одна діяльність управляє усіма фрагментами.

Ця дія містить наступний код для будь-якого фрагмента в кінці методу цього фрагмента -

Наприклад - фрагмент MoreFragment:

MoreFragment firstFragment = new MoreFragment();
getSupportFragmentManager().beginTransaction()
.replace(R.id.article_fragment, firstFragment)
.addToBackStack(null).commit();

Так,

1) Яке значення має addToBackStack(null)а commit()?

2) Навіщо потрібно передавати нульовий параметр addToBackStack?

3) Як отримати цей фрагмент після того, як його додати так?

Здається, цей код марний, оскільки я запустив код без останнього рядка, .addToBackStack(null).commit()і він працював без проблем.


developer.android.com/reference/android/app/…, у деяких випадках ви повинні викликати цей метод.
Люцифер


3
Ви можете передати ім'я фрагмента як параметр до addToBackStack (ім'я) замість Null. Якщо ви передасте Null, тоді ви не зможете використовувати метод FragmentManager.popBackStackImmediate (ім'я рядка, прапори int); або popBackStack (ім'я рядка, прапори int); тому що ім'я було Нуль. Тож методи popBackstack не працюватимуть. Я пропоную вам передавати ім'я фрагмента як параметри, а не передавати значення null.
luckylukein

Відповіді:


111

Що означає addToBackStack (null), за яким слідує коміт ()?

Цитування документів:

Викликаючи addToBackStack (), транзакція заміни зберігається у зворотному стеці, щоб користувач міг повернути транзакцію та повернути попередній фрагмент, натиснувши кнопку Назад.

Якщо до транзакції додати кілька змін (наприклад, інший add () або remove ()) і викликати addToBackStack (), тоді всі зміни, застосовані до виклику коміта (), додаються до заднього стеку як одна транзакція та кнопка Назад переверне їх усіх разом.

Порядок додавання змін до FragmentTransaction не має значення, за винятком:

Ви повинні телефонувати commit()останнім. Якщо ви додаєте кілька фрагментів до одного контейнера, порядок їх додавання визначає порядок їх появи в ієрархії подання.

Тож вам доведеться здійснити нарешті.

Чому вам потрібно передати нульовий параметр addToBackStack?

Він не повинен бути нульовим, це може бути рядок. Якщо ви не хочете, просто передайте нуль.

загальнодоступний реферат FragmentTransaction addToBackStack (ім'я рядка)

Додано в рівень API 11 Додайте цю транзакцію до заднього стеку. Це означає, що транзакція буде запам'ятовуватися після її вчинення, а також поверне її роботу, коли пізніше вискочить із стека.

Ім'я параметрів Необов’язкове ім’я для цього стану зворотного стеку або нуль.

Щодо:

Здається, цей код марний, оскільки я запустив код без останнього рядка .addToBackStack (null) .commit (), і він працював без проблем

Якщо ви хочете перейти до попереднього фрагмента, додайте його у backstack. Тож це залежить від того, чи хочете ви додати фрагмент до бекстейка.

Як отримати цей фрагмент після додавання таким чином?

Ви вже маєте екземпляр фрагмента firstFragment. Тож я не знаю, що ви маєте на увазі під тим, щоб отримати фрагмент пізніше.

Більше інформації @

http://developer.android.com/guide/components/fragments.html

http://developer.android.com/reference/android/app/FragmentTransaction.html#addToBackStack(java.lang.String)


Ви також можете додати це до своєї відповіді в документі API: Додати цю транзакцію в задній стек. Це означає, що транзакція буде запам'ятовуватися після її вчинення, і поверне її роботу назад, коли пізніше вискочить із стека. Ім'я параметрів Необов’язкове ім’я для цього стану стека або нуль.
Дирборг,

Отже, як я зрозумів, ціллю додавання до backstack є виконання навігації, як це робиться за допомогою кнопки «Назад» для переходу до попереднього фрагмента?
Боже мій

добре, якщо ви передаєте параметр addToBackStack, то чому нам потрібно це робити, getFragmentManager().popBackStackImmediate()якщо кнопка "Назад" може зробити це самостійно з / без передачі параметра? Дивіться відповідь - stackoverflow.com/questions/21156153/…
Боже мій

@VedPrakash вам не потрібно мати. Також це взагалі різне запитання та відповідь. Ви можете легко дізнатися про себе, маючи два фрагменти, додавши їх у зворотний стек і натиснувши кнопку "Назад"
Рагунандан,

@VedPrakash читав керування фрагментами @ developer.android.com/guide/components/fragments.html
Рагхундан

17

tagРядок в addToBackStack(String name)дає спосіб знайти стек назад на потім вискочити прямо на цьому місці. Це означало використовувати в методі popToBackStack(String name, int flags):

Перемістіть останній перехід фрагмента зі зворотного стеку фрагмента менеджера. Ця функція є асинхронною - вона передає запит на спливаюче повідомлення, але дія не буде виконана, поки програма не повернеться до циклу подій.

name: якщо не null, це ім'я попереднього стану назад, який потрібно шукати; якщо буде знайдено, усі стани до цього стану будуть видалені. Прапор POP_BACK_STACK_INCLUSIVE може використовуватися для контролю того, чи з'являється сам названий стан. Якщо значення нульове, відображається лише верхній стан.

прапори: Або 0, або POP_BACK_STACK_INCLUSIVE.

Іншими словами, він буде видавати ваш задній стек, поки не знайде фрагмент, доданий nameв addToBackStack(String name).

Наприклад, якщо ви виконуєте ряд доповнень або замінюєте менеджер фрагментів, даючи імена "frag1", "frag2", "frag3", "frag4", а пізніше хочете повернутися безпосередньо до фрагмента 2, доданого за допомогою addToBackStack (" frag2 "), ви телефонуєте popToBackStack("frag2", 0).

Так,

  • Використання .addToBackStack("fragName"): якщо ви хочете пізніше popToBackStack(String name, int flags)вивести більше одного заднього стека.

  • Використання .addToBackStack(null): Якщо ви не хочете, щоб пізніше виводилося більше одного заднього стека, але ви все одно хочете виводити по одному. Зробіть це, навіть якщо ви не будете явно викликати popToBackStack (), але замість цього дозволите реалізації типовим тиском обробляти задній стек.

  • Використання .disallowAddToBackStack(): Якщо ви не хочете ні зворотного натискання, ні дзвінка popBackStack (), це явно. Він переконається, що жодна частина коду не використовує .addToBackStack ().


1

Ваші відповіді застаріли. Якщо ви не хочете додавати фрагменти до зворотного стеку, скористайтесь наведеним нижче фрагментом коду:

    public static void replaceFragment (@NonNull FragmentManager fragmentManager,
            @NonNull Fragment fragment, int frameId){

        checkNotNull(fragmentManager);
        checkNotNull(fragment);
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(frameId, fragment);
        transaction.disallowAddToBackStack(); // <-- This makes magic!
        transaction.commit();
    }

Нижче наведено милий приклад того, як його використовувати:

GameFragment fragment = GameFragment.newInstance(mGameObject, currentQuestion);
ActivityUtils.replaceFragment(getFragmentManager(), fragment, R.id.main);

6
Заборонено де? Я нічого не бачу в документації чи джерелі FragmentTransaction.
Rup

3
Обережно, якщо ви disallowAddToBackStack, то будь-які майбутні дзвінки addToBackStack викинуть IllegalStateException. Якщо addToBackStack вже було викликано, цей метод викине IllegalStateException.
Катір
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.