Appcompatv7 - v21 Navigationsschublade ohne Hamburger-Symbol


101

Ich implementiere die Navigationsschublade im Lutscherstil mit der neuesten Appcompat-Unterstützungsbibliothek, aber das Problem ist, dass das Hamburger-Symbol nie angezeigt wird. Es wird nur das Symbol "Zurück" angezeigt.

Dies ist mein Aktivitätscode

import android.os.Bundle;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.Toolbar;
import android.view.View;

public class Home extends ActionBarActivity {

private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mDrawerToggle;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home);
    initViews();
}


private void initViews(){

    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);


    toolbar.setTitleTextColor(getResources().getColor(android.R.color.white));
    setSupportActionBar(toolbar);

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,toolbar ,  R.string.drawer_open, R.string.drawer_close) { 

        /** Called when a drawer has settled in a completely closed state. */ 
        public void onDrawerClosed(View view) {
            super.onDrawerClosed(view);
            //getActionBar().setTitle(mTitle);
            //invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        } 

        /** Called when a drawer has settled in a completely open state. */ 
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            //getActionBar().setTitle(mDrawerTitle);
            //invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        } 
    }; 


    // Set the drawer toggle as the DrawerListener 
    mDrawerLayout.setDrawerListener(mDrawerToggle);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setHomeButtonEnabled(true); 

 }
}

Dies ist meine Stildatei

 <resources>
 <!-- Application theme. -->
<style name="Theme.Test" parent="@style/Theme.AppCompat.Light">

    <!-- customize the color palette -->
    <item name="colorPrimary">@color/primary</item>
    <item name="colorPrimaryDark">@color/primary_dark</item>
    <item name="colorAccent">@color/accent</item>
    <item name="windowActionBar">false</item>
    <item name="drawerArrowStyle">@style/Theme.Test.DrawerArrowStyle</item>
</style>

<style name="Theme.Test.DrawerArrowStyle" parent="@style/Widget.AppCompat.DrawerArrowToggle">
    <item name="spinBars">true</item>
    <item name="color">@android:color/white</item>
</style>

Die Layoutdatei

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:minHeight="?attr/actionBarSize"
    app:theme="@style/ThemeOverlay.AppCompat.ActionBar" />

<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:layout_below="@+id/toolbar">

    <!-- The main content view -->

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    <!-- The navigation drawer -->

    <ListView
        android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#111"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp" />
</android.support.v4.widget.DrawerLayout>

</RelativeLayout>

Navigationsschublade mit Zurück-Schaltfläche

Navigationsschublade mit Zurück-Schaltfläche

In beiden Fällen wird nur der Pfeil nach hinten angezeigt. Ich habe viele Beiträge gelesen, aber nichts scheint einen Unterschied zu machen. Jede Hilfe wäre dankbar.

Antworten:


148

Sie müssen anrufen

mDrawerToggle.syncState();

2
Ich denke in onDrawerClosed () und onDrawerOpened ()
Paul Verest

14
Kurz nachdem Sie IhreActionBarDrawerToggle
Pedro Oliveira

1
Hallo! Können wir das Hamburger-Symbol mDrawerToggl.syncState()anzeigen, ohne es anzurufen? Eigentlich zeige ich die Navigationsleiste als Überlagerung in der Symbolleiste, sodass die Animation in meinem Fall nicht erforderlich ist.
Shajeel Afzal

1
Vielleicht ist Ihr Problem ein anderes @AlexVPerl. Sie müssen nicht abstimmen, nur weil es bei Ihnen nicht funktioniert hat. Zur Hölle, wenn ich alle Antworten ablehnen will, die für mich nicht funktionieren ...
Pedro Oliveira

1
@PedroOliveira Ist das nicht der Anwendungsfall für Up / Down-Abstimmungsschaltflächen?
AlexVPerl

19

Stellen Sie sicher, dass Sie den richtigen Schubladenschalter importieren.

Als ich die v4-Version importierte, hatte ich den Pfeil (unten).

import android.support.v4.app.ActionBarDrawerToggle;

Das Ändern in dieses (unten, Version 7) hat mein Problem behoben.

import android.support.v7.app.ActionBarDrawerToggle;

14

Stellen Sie sicher, dass Sie anrufen

mDrawerToggle.syncState();

Nach dem Anruf

getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
getSupportActionBar().setHomeButtonEnabled(true); 

Ist es möglich, ohne die Symbolleiste als Aktionsleiste festzulegen, den Hamburger zum Zeichnen anzuzeigen?
Android-Entwickler

13

Wenn Sie ActionBarDrawerToggle verwenden, müssen Sie es während onPostCreate () und onConfigurationChanged () aufrufen.

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

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        // Pass any configuration change to the drawer toggls
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

Und onOptionsItemSelectedauch.
Brais Gabin

Keine Hilfe für mich. Android 6.0
a_subscriber

9

Da mein NavigationDrawer ein Fragment und keine Aktivität erweiterte, konnte ich postCreate nicht überschreiben. Das Folgende ist was ich getan habe.

   ActionBar actionBar = getActionBar();
   actionBar.setDisplayHomeAsUpEnabled(true); // this sets the button to the    back icon
   actionBar.setHomeButtonEnabled(true); // makes it clickable
   actionBar.setHomeAsUpIndicator(R.drawable.ic_drawer);// set your own icon

Ich hoffe es hilft!


Vielleicht etwas näher erläutern, warum dies Ihrer Meinung nach der fragenden Person helfen würde?
Mikael Ohlson

Tut mir leid, dass sie wollten, dass das Hamburger-Symbol angezeigt wird und ich es mit dem obigen Code geändert habe. Bitte lesen Sie die Kommentare neben dem Code. Dies könnte Personen helfen, die mit dem Zurück-Symbol in der Navigationsschublade hängen bleiben.
user2132226

Wie würden Sie den Hamburger in der Symbolleiste zeichnen lassen, ohne die Symbolleiste als Aktionsleiste zu erstellen?
Android-Entwickler

6

Vergessen Sie nicht, die onOptionsItemSelected-Methode zu überschreiben und zu überprüfen, ob auf ctionBarDrawerToggle geklickt wurde. In diesem Fall geben Sie true zurück, da sonst die Aktivität beendet wird.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (actionBarDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

3
return actionBarDrawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item)
Einzeiler

5

Sie können dies einfach verwenden:

// Defer code dependent on restoration of previous instance state.
mDrawerLayout.post(new Runnable() {
    @Override
    public void run() {
        mDrawerToggle.syncState();
        getActionBar().setHomeAsUpIndicator(R.drawable.ic_drawer);
    }
});

Entfernen Sie den Code nach mDrawerToggle.syncState () , und los geht's.
Ahmad Jamil Al Rasyid

3

Stellen Sie beim Einschließen von ActionBarDrawerToggle sicher, dass Sie die post-Methode verwenden:

mDrawerLayout.post(new Runnable() {
   @Override
   public void run() {
       mDrawerToggle.syncState();
   }
});

Das hat bei mir funktioniert! Das und auch das Entfernen einer Problemumgehung, die setHomeAsUpIndicator(R.drawable.ic_menu/ic_back)damit durchgeführt wurde, erzwang das Symbol, das beim Umschalten zwischen Fragmenten vorgetäuscht wurde. Nach der Aktualisierung auf das neue animierte Burger-Symbol reicht dies jedoch nicht aus.
Jota

Es funktionierte wirklich auf API 21
Ramireddy Chintalapudi

3

mDrawerToggle.syncState() hat bei mir nicht funktioniert, aber ich habe es schließlich zum Arbeiten gebracht:

getSupportActionBar().setHomeAsUpIndicator(R.drawable.hamburger_icon);

Ich habe jedoch keine Symbolleiste verwendet.


Diese Codezeile hat mir den Tag gerettet. Ich habe meinen Eclipse-Code in Android Studio konvertiert und plötzlich wurde meine Schubladen-Umschalttaste automatisch in Pfeil konvertiert. Jetzt funktioniert es einwandfrei, nachdem diese Codezeile hinzugefügt wurde. Vielen Dank @ John Leehey
Hitesh Kamani

3

Ich habe auch ein ähnliches Problem erhalten. In meinem Fall bestand das Problem darin, dass ich beim Starten von actionbartoggle kein gültiges Symbolleistenargument übergeben habe (die Symbolleiste wurde später initialisiert). Ohne eine ordnungsgemäße Symbolleiste ungleich Null kann ActionBarToggle kein Hamburger-Symbol erstellen.

actionBarToggle = ActionBarDrawerToggle(this, mDrawer, toolbar, 
R.string.drawer_open, R.string.drawer_close);

1

Sie können syncState () aus onPostCreate Ihrer Aktivität aufrufen, um den Indikator mit dem Status des verknüpften DrawerLayout zu synchronisieren, nachdem onRestoreInstanceState aufgetreten ist.

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

ActionBarDrawerToggle kann auch direkt als DrawerLayout.DrawerListener verwendet werden. Wenn Sie bereits einen eigenen Listener bereitstellen, rufen Sie jede der Listener-Methoden von sich aus auf.

private ActionBarDrawerToggle mDrawerToggle;
private DrawerLayout mDrawerLayout;
  .
  .
  .
  .
mDrawerLayout.setDrawerListener(mDrawerToggle);

    mDrawerLayout.post(new Runnable() {
        @Override
        public void run() {
            mDrawerToggle.syncState();
        }
    });

1

Die Navigationsleiste wurde beim Klicken auf das Aktionsleistenmenü nicht angezeigt. Das hat es für mich behoben.

   @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
      //add your switch statement


        return super.onOptionsItemSelected(item);
    }

1

Das funktioniert bei mir. Ich habe AppCompatActivity anstelle von ActionBarActivity erweitert.

mActionBarDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,null, R.string.drawer_opened, R.string.drawer_closed) {
    @Override
    public void onDrawerOpened(View drawerView) {
        super.onDrawerOpened(drawerView);
        if( getSupportActionBar()!= null)
        getSupportActionBar().setTitle(R.string.drawer_opened);
        mActionBarDrawerToggle.syncState();
    }

    @Override
    public void onDrawerClosed(View drawerView) {
        super.onDrawerClosed(drawerView);
        if(getSupportActionBar() != null)
            getSupportActionBar().setTitle(R.string.drawer_closed);
            mActionBarDrawerToggle.syncState();

    }
};
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.