3

Я делаю приложение NavigationDrawer. У меня есть иерархия, как приведено нижеAndroid Fragment не добавлен в Back Stack

NavigationDrawer -> RootFragment (не добавляется к спине Stack) -> Подробный Фрагмент (Добавлен Назад Stack)

Теперь я пытаюсь показать сообщение пользователю, когда он пытается выйти из приложения, нажав кнопку «Назад». Вот код, который я использую для него.

@Override 
    public void onBackPressed() { 
     if (getFragmentManager().getBackStackEntryCount() > 0) { 
      getFragmentManager().popBackStack(); 
     } 
     else if (getFragmentManager().getBackStackEntryCount() == 0) { 
      new AlertDialog.Builder(this) 
        .setMessage("Are you sure you want to exit?") 
        .setCancelable(false) 
        .setPositiveButton("Yes", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int id) { 
          MainActivity.this.finish(); 
         } 
        }) 
        .setNegativeButton("No", null) 
        .show(); 

     } 
     else 
     { 
      super.onBackPressed(); 
     } 
    } 

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

Но, если я обновляю такой код, нажатие кнопки «Назад» возвращает пользователя в корневой режим. Таким образом, он выглядит как getFragmentManager(). GetBackStackEntryCount() равен нулю, даже если подробный фрагмент добавлен в задний стек.

@Override 
    public void onBackPressed() { 
     if (getFragmentManager().getBackStackEntryCount() > 0) { 
      getFragmentManager().popBackStack(); 
     } 
     else 
     { 
      super.onBackPressed(); 
     } 
    } 

Вот как я называю фрагмент детали из корневого фрагмента.

FragmentManager fragmentManager = getFragmentManager(); 
       Fragment fragment = SubCategoryListFragment.newInstance(false); 
       fragmentManager.beginTransaction() 
         .add(R.id.subCategoryDetails, fragment) 
         .addToBackStack(null) 
         .commit(); 

Вот вид корня, который открывается из меню боковой панели навигации.

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 


    <android.support.v7.widget.RecyclerView 
     android:id="@+id/categoriesRecyclerView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@android:color/transparent" 
     android:cacheColorHint="@android:color/transparent"/> 

    <FrameLayout 
     android:id="@+id/subCategoryDetails" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"></FrameLayout> 


</FrameLayout> 

Что я здесь делаю неправильно? Каков правильный способ реализации этого?

Спасибо.

ответ

3

Предполагая, что вы используете фрагменты поддержки, вы должны использовать getSupportFragmentManager() в вашей деятельности. С getFragmentManager() вы получаете собственный менеджер фрагментов. Однако в классах фрагментов поддержки getFragmentManager() возвращает менеджер фрагментов поддержки, что может немного запутать.

0

Передайте действительный тег вместо NULL в этом заявлении

addToBackStack(null) 
+0

Все те же самые! – Zach

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