2

У меня проблема, с которой я столкнулся последние пару дней и, похоже, не нахожу ответа на нее.Android BackStack NavigationDrawer

Описание: У меня есть основное действие, которое содержит ящик для навигации. Каждый элемент навигационного ящика (при нажатии) создает фрагмент. В этом фрагменте есть listView объектов, который создает другие фрагменты при нажатии. В этих фрагментах у меня есть еще один listView объектов, который открывает другие фрагменты. Другими словами, существует ряд фрагментов, которые открывают другой фрагмент. Что-то вроде этого:

http://s22.postimg.org/pddo5gsv5/backstack.png

Для того, чтобы иметь возможность вернуться к каждому фрагменту, я реализовал метод addToBackstack («строка»).

Мой вопрос в том, как я могу выполнить правильную загрузку для моего приложения, так что, когда я нажимаю элемент «Навигационный элемент навигации», все фрагменты, которые были добавлены в backstack, очищаются, без того, что открывается элемент «Ящик навигации».

Любая помощь будет оценена по достоинству. Спасибо !

EDIT

Хорошо, кажется, мне удалось понять это. Принимая во внимание, что советы я получил от ответов, вот решение, которое я придумал:

@Override 
public void onBackPressed() { 
    int count = getFragmentManager().getBackStackEntryCount(); 
    if (count != 0) { 
     FragmentManager.BackStackEntry backEntry = getFragmentManager() 
       .getBackStackEntryAt(
         getFragmentManager().getBackStackEntryCount() - 1); 
     if (backEntry.getName() == NAVIGATION) { 
      finish(); 
     } else 
      getFragmentManager().popBackStack(); 
    } else { 
     super.onBackPressed(); 
    } 
} 

Выражаясь словами: Во-первых, я добавил запись backstack даже для фрагментов верхнего уровня, учитывая их конкретный тег. Я переопределил функцию кнопки «Назад» активности, так что, когда последняя запись назад - это фрагмент верхнего уровня для завершения действия (чтобы он не просто отделял фрагмент от активности, а оставался пустой). В противном случае, если последняя запись не является фрагментом верхнего уровня, выполните popBackStack. PS: все фрагменты не-верхнего уровня добавляются в стопку с другим тегом, а затем верхний уровень. Кроме того, я должен был сделать POP_BACK_STACK_INCLUSIVE в приложении для прослушивания кликов навигации.

getFragmentManager().popBackStack(null, 
       FragmentManager.POP_BACK_STACK_INCLUSIVE); 

Благодарим всех вас за советы и, надеюсь, этот EDIT поможет другим пользователям.

+0

Все больше и больше я работаю с компоновкой ящика. Я думаю, что приложение «iosched» использовало наилучшую возможную вещь. В нескольких действиях каждый имеет свой собственный фрагмент контента и свой собственный ящик с предварительно выбранным сектором, поэтому вы работаете только с стеком активности и не должны беспокоиться о стеке фрагментов. «Для тебя это моя мудрость». –

ответ

2

Вы можете использовать следующий код, чтобы решить вашу проблему:

getFragmentManager().beginTransaction() 
        .replace(R.id.fragment_container, fragment) 
        .addToBackStack(fragment_tag) 
        .commit(); 

Для того, чтобы сделать код над работой вам нужно создавать фрагменты динамически. Поскольку фрагменты жесткого диска не могут быть заменены. Для этого вы можете создать контейнер (FrameLayout и т. Д.), Который в нашем примере имеет идентификатор fragment_container. Затем вышеприведенный код добавит фрагмент в контейнер динамически.Наконец, вы должны передать как параметр в addToBackStack метод fragment_tag. Это означает, что эта транзакция будет добавлена ​​в задний стек. И, наконец, для того, чтобы получить его от backstack вы должны использовать код ниже:

getFragmentManager().popBackStack(fragment_tag, FragmentManager.POP_BACK_STACK_INCLUSIVE)); 

В POP_BACK_STACK_INCLUSIVE флаг, гарантирует, что «все соответствующие записи будут потребляться до одного, который не соответствует найдено или дно стека достигнуто. В противном случае все записи до, но не включая эту запись, будут удалены ».

+0

Что именно вы подразумеваете, создавая фрагменты динамически? Способ создания фрагментов создавая их xml-макет, а затем я раздуваю их в java-коде. После этого я использую методы .add и .replace, чтобы добавить их в действие. И я использую точный метод, который вы написали выше, но затем, на кнопке onClick моей навигации Ящик прослушивателя, я получаю исключение из null-указателя на некоторые элементы фрагментов, которые я хочу выскочить из задней части. – Phantom

+0

@Phantom Я имею в виду, что вы не можете заменить фрагмент, который статически помещается в файл макета xml. Вам необходимо создать их программно. –

+0

Но разве это не так против Android Основы, нужно создать макет фрагмента по коду? Я знаю, что это можно сделать, но намного сложнее и трудоемко. Кроме того, я создаю фрагменты статически с помощью xml-файла, и я могу заменить их без каких-либо проблем. Единственная проблема, с которой я сталкиваюсь, заключается в том, что когда я пытаюсь удалить их из backstack в диспетчере кликов для навигации, я получаю исключение из нулевого указателя, и я не знаю, почему, потому что я не хочу обращаться к ним, я только хочу удалить из backstack – Phantom

0

Вы можете очистить фрагмент backstack, используя что-то вроде:

fragmentManager.popBackStack("string", FragmentManager.POP_BACK_STACK_INCLUSIVE); 

, а затем вы можете addToBackstack и commit как обычно. More info.

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

FragmentManager fragmentManager = getSupportFragmentManager(); 
if(clearBackStack) { 
    fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
} 
FragmentTransaction ft = fragmentManager.beginTransaction(); 
ft.replace(R.id.content_frame, fragment); 
if(!clearBackStack) { 
    ft.addToBackStack(null); 
} 
ft.commit(); 
+0

Это точный метод, который я использую сейчас (я добавил все фрагменты с той же строкой в ​​backstack). Где именно я должен поставить эту функцию? Причина, в которой это прямо сейчас (в DrawerItemClicklListener я получаю исключения из нулевого указателя из некоторых элементов фрагментов, которые я хочу выскочить из задней стопки – Phantom

+0

Добавлен пример, он может быть помещен в ваш слушатель. Исключения NullPointerExceptions могут быть связаны с другими проблемами, вы можете дважды проверить жизненный цикл фрагмента –

+0

и что такое переменная clearBackStack? – Phantom

Смежные вопросы