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

102

我正在使用最新的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>

导航抽屉显示返回按钮

导航抽屉显示返回按钮

两种情况下都只显示了返回箭头,我已经阅读了许多帖子,但似乎没有什么区别。表示感谢的任何帮助。

13个回答

149
您需要打电话。
mDrawerToggle.syncState();

2
我猜测在 onDrawerClosed() 和 onDrawerOpened() 方法内部。 - Paul Verest
14
在初始化ActionBarDrawerToggle之后,立即进行操作。 - Pedro Oliveira
1
你好!我们能否在不调用mDrawerToggl.syncState()的情况下显示汉堡图标?实际上,我正在将导航抽屉作为工具栏上的叠加层显示,因此在我的情况下不需要动画。 - Shajeel Afzal
1
也许你的问题是另外一个问题@AlexVPerl。不必因为它对你没有帮助就投反对票。如果我要投反对票,所有对我没有用的答案都要被投反对票... - Pedro Oliveira
1
@PedroOliveira 这不是点赞/踩按钮的使用情况吗? - AlexVPerl
显示剩余8条评论

19

请确保您正在导入正确的抽屉式菜单切换按钮。

当我导入v4版本时出现了箭头(如下所示)。

import android.support.v4.app.ActionBarDrawerToggle;

将它更改为这个(下面的v7)解决了我的问题。

import android.support.v7.app.ActionBarDrawerToggle;

15

确保在调用

mDrawerToggle.syncState();

之后再调用。

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

1
不设置工具栏为操作栏,是否可以显示汉堡图标? - android developer

13

当使用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);
    }

还有onOptionsItemSelected - Brais Gabin
不适用于我。Android 6.0 - Alexei

9

由于我的 NavigationDrawer 扩展的是一个 Fragment 而不是 Activity,所以我无法重写 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

希望能帮到你!

也许你可以稍微详细解释一下为什么你认为这会对提问者有所帮助? - Mikael Ohlson
抱歉,他们想要显示汉堡图标,而我更改的方式是使用上面的代码。请阅读代码旁边的注释。这可能有助于那些在导航抽屉中卡住返回图标的人。 - user2132226
你如何在不将工具栏作为操作栏的情况下,在工具栏中显示汉堡图标? - android developer

6
不要忘记重写onOptionsItemSelected方法并检查是否点击了ctionBarDrawerToggle,如果是,则返回true,否则活动将结束。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (actionBarDrawerToggle.onOptionsItemSelected(item)) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

3
return actionBarDrawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item):返回 actionBarDrawerToggle.onOptionsItemSelected(item) 或者 super.onOptionsItemSelected(item) - gregschlom

5
你可以简单地使用这个:
// 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() 代码后,你就可以开始了。 - Ahmad Jamil Al Rasyid

3
包含ActionBarDrawerToggle时,请确保使用post方法:
mDrawerLayout.post(new Runnable() {
   @Override
   public void run() {
       mDrawerToggle.syncState();
   }
});

这对我有用!还有一件事是删除使用setHomeAsUpIndicator(R.drawable.ic_menu/ic_back)所做的解决方法,该解决方法在切换片段时强制使用所需的图标。 但是,在更新为新的动画汉堡图标后,它无法完成任务。 - Jota

3
我也遇到了类似的问题,我的情况是在初始化actionbartoggle时,我没有传递有效的工具栏参数(工具栏稍后初始化),如果没有适当的、非空的工具栏,ActionBarToggle将无法创建汉堡图标。
actionBarToggle = ActionBarDrawerToggle(this, mDrawer, toolbar, 
R.string.drawer_open, R.string.drawer_close);

3

mDrawerToggle.syncState() 对我来说没有起作用,但最终我通过以下方式使其正常工作:

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

然而,我没有使用工具栏。


这行代码救了我的一天。我已经将我的 Eclipse 代码转换到 Android Studio,突然间我的抽屉切换按钮自动转换为箭头。现在,在添加了这行代码之后,它正常工作了。非常感谢 @john Leehey。 - Hitesh Kamani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接