58

Ich probiere die neue Toolbar-Komponente aus und habe Probleme mit dem Navigationssymbol. Ich möchte ein benutzerdefiniertes Symbol für zurück Navigation implementieren:Symbolleistennavigationssymbol nie eingestellt

In meinem Manifest ich ein Elternteil zu meiner Tätigkeit gesetzt:

<activity android:name=".CardsActivity" android:parentActivityName=".MainActivity"> 
    <!-- Parent activity meta-data to support API level 7+ --> 
    <meta-data 
     android:name="android.support.PARENT_ACTIVITY" 
     android:value=".MainActivity" /> 
</activity> 

Ich erkläre die Symbolleiste wie folgt aus:

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin" 
    tools:context="com.example.lollitest.MainActivity" > 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/my_awesome_toolbar" 
     android:layout_height="wrap_content" 
     android:layout_width="match_parent" 
     android:minHeight="?attr/actionBarSize" 
     android:layout_marginBottom="10dp" 
     android:background="?attr/colorPrimary" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/my_awesome_toolbar" 
     android:text="@string/hello_world" /> 

</RelativeLayout> 

dann in Meine Aktivität Ich konfiguriere die Toolbar wie folgt:

Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar); 
toolbar.setNavigationIcon(R.drawable.ic_good); 
toolbar.setTitle("Title"); 
toolbar.setSubtitle("Sub"); 
toolbar.setLogo(R.drawable.ic_launcher); 
setSupportActionBar(toolbar); 

Welche mir geben: Toolbar with back button

Die Rückseite Symbol ist nicht die, die ich mit setNavigationIcon() gesetzt! Was auch immer ziehbare ich der Methode gebe, das Navigationssymbol ist immer der Zurück-Pfeil.

Ich habe versucht, die Elternvereinigung im Manifest zu entfernen, aber der einzige Effekt ist (offensichtlich) zu verhindern, dass die Schaltfläche zurückgeht.

Im Gegenteil, wenn ich die Standard-Back-Pfeil-Symbol will und nicht setNavigationIcon() aufrufen ich habe kein Symbol überhaupt.

Wie kann das Navigationssymbol in der Symbolleiste richtig gehandhabt werden (benutzerdefiniert und Standard)?

Anmerkung: Ich bin mein Test auf Android 4.4

Antwort

110

Derzeit laufen Sie es verwenden können, die Reihenfolge zu ändern: (es scheint ein Fehler zu sein)

Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar); 
setSupportActionBar(toolbar); 

toolbar.setNavigationIcon(R.drawable.ic_good); 
toolbar.setTitle("Title"); 
toolbar.setSubtitle("Sub"); 
toolbar.setLogo(R.drawable.ic_launcher); 
+1

der Tat, dass die Arbeit für ein individuelles Symbol! Und wenn das Standardsymbol gewünscht wird, gibt es kein Äquivalent zu sethomebuttonenabled (true), oder? – grunk

+4

getSupportedActionBar(). SetHomeButtonEnabled (true); –

+10

@GabrieleMariotti nur korrigieren! getSupportActionBar(). setHomeButtonEnabled (true); –

19

(Die Antwort auf user802421)

private void setToolbar() { 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    if (toolbar != null) { 
     setSupportActionBar(toolbar); 
     toolbar.setNavigationIcon(R.drawable.ic_action_back); 
     toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       onBackPressed(); 
      } 
     }); 
    } 
} 

toolbar.xml

<android.support.v7.widget.Toolbar 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="@dimen/toolbar_height" 
    android:background="?attr/colorPrimaryDark" /> 
3

Ich hatte simillar Problem. Nach großen Kopfschmerzen fand ich, dass mein ActionBarDrawerToggle das Symbol änderte, auch wenn es das Symbol nicht ändern sollte (weil ich der Toggle-Komponente keinen Verweis auf die Symbolleiste gegeben habe). Also in meiner NavigationDrawerFragment Klasse (die das Öffnen und Schließen behandelt) in setUp(...) Methode ich setze
mDrawerToggle.setHomeAsUpIndicator(R.drawable.app_icon);
und schließlich hat es funktioniert.

22

Spezifisch für das Navigationssymbol, dann ist dies die richtige Reihenfolge

// get the actionbar as Toolbar and set it up 
Toolbar toolbar = (Toolbar) findViewById(R.id.signIn_toolbar); 
setSupportActionBar(toolbar); 

die Toolbar Inform Navigation zur Verfügung zu stellen zurück.Das wird das Symbol in das

getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

Später

Symbol Standardmaterial bis das Symbol außer Kraft setzt mit dem benutzerdefinierten ein, in meinem Fall des Holo zurück Symbol

toolbar.setNavigationIcon(R.drawable.ic_chevron_left_white_36dp); 
3

Ich versuchte Symbolleiste wie @Gabriele Mariotti einzurichten , aber ich hatte ein Problem mit dem Titel. Also dann setze ich die Reihenfolge

toolbar.setTitle("Title") 
setSupportActionBar(toolbar); 
toolbar.setNavigationIcon(R.drawable.ic_good); 

und es funktioniert.

4

Ich habe gerade die Lösung gefunden. Es ist wirklich sehr einfach:

mDrawerToggle.setDrawerIndicatorEnabled(false); 

Ich hoffe, es wird Ihnen helfen.

+0

Bitte sagen Sie uns, wie Sie das 'mDrawerToggle' Objekt erhalten! –

+0

android.support.v7.widget.Toolbar hat keine setDrawerIndicatorEnabled-Methode – Miquel

+0

@AdrianPreuss Sie sollen es selbst erstellen. Beispiel: 'ActionBarDrawerToggle (Aktivität, Schublade, Symbolleiste, R.string.navigation_drawer_open, R.string.navigation_drawer_close)' –

3

Ich benutzte die Methode unten, die wirklich ein Rätsel aller oben genannten ist. Ich habe auch festgestellt, dass onOptionsItemSelected nie aktiviert ist.

mDrawerToggle.setDrawerIndicatorEnabled(false); 
    getSupportActionBar().setHomeButtonEnabled(true); 

    Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar); 
    if (toolbar != null) { 
     toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       onBackPressed(); 
      } 
     }); 
    } 
3

können Sie invalidate() Methode verwenden Symbolleiste Zustand in jedem Ort zu ändern. Beispiel:

Toolbar toolbar = (Toolbar)findViewById(R.id.my_awesome_toolbar); 
setSupportActionBar(toolbar); 

toolbar.setNavigationIcon(R.mipmap.arrow_white); 
toolbar.invalidate();  // restore toolbar 
0

Try this:

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:toolbar="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/tool_drawer" 
     android:layout_width="match_parent" 
     android:layout_height="?actionBarSize" 
     toolbar:navigationIcon="@drawable/ic_navigation"> 

    </android.support.v7.widget.Toolbar> 
4

Verwenden setNavigationIcon um es zu ändern. Vergiss nicht zuerst ActionBarDrawerToggle zu erstellen!

Beispielcode für mich arbeiten:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 


    drawer = (DrawerLayout)findViewById(R.id.drawer_layout); 

    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
      this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    drawer.setDrawerListener(toggle); 

    toggle.syncState(); 

    toolbar.setNavigationIcon(R.drawable.ic_menu); 
+0

Das funktionierte für mich - endlich! Diese Aufgabe, das Standardmenü von BurgerMenu zu ändern, war viel zu schwer. Ich kann nicht herausfinden, warum das funktionierte, nachdem alles andere eingestellt wurde, und dann das Symbol zuweisen - weiß jemand das? – ZooMagic

0

Arbeit für mich ...

<android.support.v7.widget.Toolbar 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/toolBar" 
     android:background="@color/colorGreen" 
     app:title="Title" 
     app:titleTextColor="@color/colorBlack" 
     app:navigationIcon="@drawable/ic_action_back"/> 
1

diese Zeile aus Aktivität entfernen, wenn Sie

@Override 
    protected void onPostCreate(Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 
     // Sync the toggle state after onRestoreInstanceState has occurred. 
     mDrawerToggle.syncState(); 
    } 

Dann setzen Symbol

hinzugefügt haben
getSupportActionBar().setHomeAsUpIndicator(icon); 
0

Falls Sie nicht wünschen, die Symbolleiste wie der Aktionsleiste setzen, können Sie diese verwenden:

 val toggle = ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) 
     toggle.isDrawerSlideAnimationEnabled = false 
     toggle.isDrawerIndicatorEnabled = false 
     toggle.setHomeAsUpIndicator(AppCompatResources.getDrawable(this, ...)) 
     drawer!!.addDrawerListener(toggle) 
     toggle.setToolbarNavigationClickListener { 
      setDrawerOpened(!isDrawerOpened()) 
     } 
     toggle.syncState() 

fun setDrawerOpened(open: Boolean) { 
    if (open == drawerLayout.isDrawerOpen(GravityCompat.START)) 
     return 
    if (open) 
     drawerLayout.openDrawer(GravityCompat.START) 
    else drawerLayout.closeDrawer(GravityCompat.START) 
}