0

Ich weiß, es gibt eine Menge Fragen wie diese beantwortet, aber nichts, was ich fand funktioniert.Android Toolbar Navigation zurück Schaltfläche Rückruf nie genannt

Ich habe eine Aktivität (MainActivity), die sich darum kümmert, verschiedene Fragmente anzuzeigen. Auch in der Aktivität habe ich Navigationsschublade, die ich nur auf einem Fragment zeige (es ist auf anderen versteckt).

Das Problem ist, dass Callback der Symbolleiste Navigation nie aufgerufen wird. Zurück-Taste wird angezeigt, aber klicken Sie darauf, tut nichts. Auch (ich weiß nicht, ob es irgendeinen Unterschied macht), aber der Benutzer kommt zu dem Fragment von einem anderen, in dem ich die gleichen Dinge mache wie in diesem, außer die Navigation zurück-Taste ist ausgeblendet.

XML für die Aktivität ist dies:

<?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> 

inklusive Symbolleiste:

<?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"/> 

nun eine Symbolleiste in Aktivität I Setup und legte einen Hörer auf seiner Rückseite Taste:

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

In diesem spezifischen Fragment, wo ich zurück Knopf brauche, mache ich das, um es zu zeigen:

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

Und da ich verwendet werden, nicht Navigation Schublade wollen/zeigte, in dem Fragment ich eine Methode in der Tätigkeit definiert aufrufen, die diesen Code ausführt:

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

Antwort

0

Auf einem spezifischen Fragment in dem Sie wollen Schaltfläche, um wieder einfach dieses Fragment hinzufügen

hinzufügen, um dieses Backstack ändern Hörer Aktivität

@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(); 
      } 
     }); 
    } 
} 

hinzuzufügen Backstack backStack Sie können diese Zeile

verwenden, wenn Sie True zu addtoback Stapel übergeben dann wird es hinzufügen und backstack.

+0

Ich füge dieses Fragment zum backstack bereits hinzu. Warum sollte ich das gleiche zweimal machen? Zuerst in 'onCreate' und dann in' onBackStackChanged'? Und jedes Mal, wenn Backstack Änderungen –

+0

Ops ich geschrieben, ist zweimal. Sie können diesen Code nur in BackStackChange Listener –

+0

einfügen, wenn Sie 2 Fragment haben und die Schaltfläche aktivieren möchten, wenn das zweite Fragment angezeigt wird. Dann können Sie überprüfen, ob ein Objekt des zweiten Fragments vorhanden ist, und es dann zum Backstack hinzufügen –