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.

Ravi
quelle

Antworten:

148

Sie müssen anrufen

mDrawerToggle.syncState();
Pedro Oliveira
quelle
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;
Donn Felker
quelle
14

Stellen Sie sicher, dass Sie anrufen

mDrawerToggle.syncState();

Nach dem Anruf

getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
getSupportActionBar().setHomeButtonEnabled(true); 
Lukas Lechner
quelle
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);
    }
Sathesh
quelle
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!

user2132226
quelle
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);
}
Alberto Penas
quelle
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);
    }
});
RobotCharlie
quelle
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();
   }
});
user3248601
quelle
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.

John Leehey
quelle
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);
Shamsul Arefin Sajib
quelle
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();
        }
    });
Jorge Casariego
quelle
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);
    }
Ronny Kibet
quelle
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();

    }
};
Mahen
quelle