Appcompatv7 – v21导航抽屉不显示汉堡包图标

我正在实施与最新的appcompat支持库棒棒糖风格的抽屉,但问题是汉堡包图标从不显示。 只显示返回图标。

这是我的活动代码

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

这是我的样式文件

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

布局文件

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

显示后面按钮的航海抽屉

显示后面按钮的航海抽屉

在这两种情况下,只显示后退箭头,我已经阅读了很多post,但似乎没有任何区别。 任何帮助,将不胜感激。

你需要打电话

 mDrawerToggle.syncState(); 

确保您正在导入正确的抽屉切换。

当我导入v4版本时,我有箭头(下图)。

 import android.support.v4.app.ActionBarDrawerToggle; 

改变它(下面,第7版)修复了我的问题。

 import android.support.v7.app.ActionBarDrawerToggle; 

当使用ActionBarDrawerToggle时,你必须在onPostCreate()和onConfigurationChanged()

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

确保你打电话

mDrawerToggle.syncState();

打电话后

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

不要忘记重写onOptionsItemSelected方法,并检查是否单击ctionBarDrawerToggle,在这种情况下返回true否则活动将完成。

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

由于我的NavigationDrawer扩展了片段而不是一个活动,我无法覆盖postCreate。 以下是我所做的。

  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 

希望它有帮助!

你可以简单地使用这个:

 // 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); } }); 

mDrawerToggle.syncState()没有为我工作,但我最终得到它的工作:

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

但是,我没有使用工具栏。

在包含ActionBarDrawerToggle时,请确保使用post方法:

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

你可以从你的Activity的onPostCreate中调用syncState(),以便在发生onRestoreInstanceState事件后,将指示器与链接的DrawerLayout的状态进行同步。

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

此外,ActionBarDrawerToggle可以直接作为DrawerLayout.DrawerListener使用,或者如果您已经提供了自己的侦听器,可以通过自己的方法调用每个侦听器方法。

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

点击操作栏菜单时不显示导航抽屉。 这为我修好了。

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

这对我有用。 我扩展了AppCompatActivity而不是ActionBarActivity。

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

我也有类似的问题,在我的情况下,问题是,当启动actionbartoggle,我没有通过有效的工具栏参数(工具栏被初始化后),没有一个适当的,非null的工具栏,ActionBarToggle将无法创build一个汉堡包图标。

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