wake-up-neo.com

Appcompat V7 - v21 In der Navigationsleiste wird kein Hamburger-Symbol angezeigt

Ich implementiere die Lollipop-Stil-Navigationsleiste mit der neuesten appcompat-Unterstützungsbibliothek, aber das Problem ist, dass das Hamburger-Symbol nie angezeigt wird. Es wird nur das Zurücksymbol 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 Styles-Datei

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

 Navigation Drawer Showing Back Button

 Navigation Drawer Showing Back Button

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

90
Ravi

Sie müssen anrufen

mDrawerToggle.syncState();
139
Pedro Oliveira

Vergewissern Sie sich, dass Sie die richtige Schublade aktivieren. 

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

import Android.support.v4.app.ActionBarDrawerToggle;

Das Ändern dieses Problems (unten, v7) hat mein Problem behoben. 

import Android.support.v7.app.ActionBarDrawerToggle;
19
Donn Felker

Stellen Sie sicher, dass Sie anrufen

mDrawerToggle.syncState();

Nach dem Anruf

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

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);
    }
12
Sathesh

Da mein NavigationDrawer ein Fragment und keine Aktivität erweitert hat, konnte ich postCreate nicht überschreiben. Das 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!

7
user2132226

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

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

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);
    }
});
4
rObOtAndChalie

mDrawerToggle.syncState() hat für mich nicht funktioniert, aber ich habe es schließlich mit zur Arbeit gebracht:

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

Ich habe jedoch keine Toolbar benutzt.

3
John Leehey

Achten Sie beim Einschließen von ActionBarDrawerToggle darauf, die post-Methode zu verwenden:

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

sie können syncState () über onPostCreate Ihrer Activity 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 selbst auf.

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

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

Ich hatte auch ein ähnliches Problem. In meinem Fall bestand das Problem darin, dass .__ beim Starten von actionbartoggle, Ich kein gültiges Symbolleistenargument übergeben hatte (die Symbolleiste wurde später initialisiert)....... kann kein Hamburger-Symbol erstellen.

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

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);
    }
0
Ronny Kibet

Das funktioniert für mich. 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();

    }
};
0
Mahen