0

Я знаю, что на этот вопрос так много ответов, но ничего не нашел.Android-панель навигации назад кнопка обратного вызова никогда не называлась

У меня есть деятельность (MainActivity), которая заботится о том, чтобы показать разные фрагменты. Кроме того, в этой операции у меня есть навигационный ящик, который я показываю только на одном фрагменте (он скрыт на других).

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

XML для деятельности заключается в следующем:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout 
    android:id="@+id/drawer_layout" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:openDrawer="start"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical"> 

     <include 
      android:id="@+id/main_toolbar" 
      layout="@layout/toolbar"/> 

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

    </LinearLayout> 

    <android.support.design.widget.NavigationView 
     android:id="@+id/nav_view" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:fitsSystemWindows="true" 
     app:headerLayout="@layout/drawer_header" 
     app:menu="@menu/activity_main_drawer"/> 
</android.support.v4.widget.DrawerLayout> 

В комплекте инструментов:

<?xml version="1.0" encoding="utf-8"?> 
    <android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@color/colorPrimary" 
    app:theme="@style/Base.ThemeOverlay.AppCompat.Dark.ActionBar"/> 

Теперь в настройках активности I панель инструментов и поместить слушателя на его задней кнопки:

setSupportActionBar(mainToolbar); 
setTitle(getResources().getString("Some title")); 
mainToolbar.setNavigationOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      onBackPressed(); 
     } 
    }); 

В этом конкретном фрагменте, где мне нужна кнопка возврата, я делаю это, чтобы показать это:

if (this.context.getSupportActionBar() != null) { 
    this.context.getSupportActionBar().setTitle("Fragment title"));   
    this.context.getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    this.context.getSupportActionBar().setDisplayShowHomeEnabled(true); 
} 

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

drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 
drawerToggle.setDrawerIndicatorEnabled(false); 

ответ

0

На определенном фрагменте где вы хотите, чтобы показать кнопку назад просто добавить этот фрагмент в backstack

добавить это изменение слушателя BackStack в операцию

@Override 
public void onBackStackChanged() { 
    if (getSupportFragmentManager().getBackStackEntryCount() != 0) 
     mToolbar.setNavigationIcon(R.drawable.ic_action_back); 
     mToolbar.setNavigationOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       onBackPressed(); 
      } 
     }); 
    } 
} 

добавить на backStack вы можете использовать эту строку

Если вы передадите true в стек addtoback, то он добавит и задержит назад.

public void changeFragment(Fragment fragment, boolean addtobackstack) { 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.setCustomAnimations(R.anim.fragment_enter, R.anim.fragment_exit); 
    fragmentTransaction.replace(R.id.fragment_container, fragment, MainActivity.TAG); 
    if (addtobackstack) 
     fragmentTransaction.addToBackStack(null); 


    fragmentTransaction.commit(); 
} 
+0

Я добавляю этот фрагмент в заднюю часть уже. Кроме того, почему я должен делать то же самое дважды? Сначала в 'onCreate', а затем в' onBackStackChanged'? И, также, каждый раз, когда обратная сторона изменяется –

+0

ops i написано дважды. вы можете поместить этот код только в BackStackChange Listener –

+0

, если у вас есть 2 фрагмента, и вы хотите, чтобы кнопка «Назад» включалась при показе 2-го фрагмента, тогда вы можете проверить, есть ли объект второго фрагмента, а затем добавить его в задний стек –

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