在Android中更改操作栏上导航抽屉图标

39

我在我的应用程序中使用ActionBar创建了一个NavigationDrawer。如上图所示,我想将导航抽屉切换按钮图标更改为我想要的东西。我该怎么改变它?

这是我的代码:

mDrawerList.setOnItemClickListener(new SlideMenuClickListener());


    // enabling action bar app icon and behaving it as toggle button
    getActionBar().setDisplayHomeAsUpEnabled(true);
    getActionBar().setHomeButtonEnabled(true);

    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
            R.drawable.hamburger_button, //nav menu toggle icon
            R.string.app_name, // nav drawer open - description for accessibility
            R.string.app_name // nav drawer close - description for accessibility
            ) {
        public void onDrawerClosed(View view) 
        {

            getActionBar().setTitle(mTitle);
            // calling onPrepareOptionsMenu() to show action bar icons
            invalidateOptionsMenu();
        }

        public void onDrawerOpened(View drawerView) {
            getActionBar().setTitle("Settings");
            // calling onPrepareOptionsMenu() to hide action bar icons
            invalidateOptionsMenu();
        }
    };
    mDrawerLayout.setDrawerListener(mDrawerToggle);
@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);
}

如果我将其更改为R.drawable.hamburger_button,它仍然显示默认图标。


R.drawable.hamburger_button 是您自己的自定义图像,而不是 Android 提供的那个? - Shivam Verma
是的,这是我的自定义图像。 - user3713706
请查看此链接:https://dev59.com/_mox5IYBdhLWcg3wWzJ7 - Giant
1
@HakHak 这个可行。非常感谢。请发布一个答案,以便我接受它。还有任何想法如何将应用程序标题放置在操作栏的中心? - user3713706
@user3713706 不用了,朋友.. 因为我也在做那个东西,而且已经成功了。我只是希望它也能帮到你,祝你编程愉快 :) - Giant
10个回答

61
使用v7 ActionBarDrawerToggle替换抽屉指示器图标为自己的drawable(非动画),您可以执行以下操作:

使用v7 ActionBarDrawerToggle替换抽屉指示器图标为自定义的drawable(非动画),您可以执行以下操作:

//After instantiating your ActionBarDrawerToggle
mDrawerToggle.setDrawerIndicatorEnabled(false);
Drawable drawable = ResourcesCompat.getDrawable(getResources(), R.drawable.your_custom_icon, getActivity().getTheme());
mDrawerToggle.setHomeAsUpIndicator(drawable);
mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        if (mDrawerLayout.isDrawerVisible(GravityCompat.START)) {
            mDrawerLayout.closeDrawer(GravityCompat.START);
        } else {
            mDrawerLayout.openDrawer(GravityCompat.START);
        }
    }
});

自定义图标的尺寸应该是多少? - TapanHP
完美的答案应该包括导航监听器,否则图标点击会被处理为返回。 - Simon Ninon
不完美。为什么它不支持动态大小? - grantespo
这解决了我的问题。 - Naveed Ahmad

10

尝试通过使用 setHomeAsUpIndicator() 方法手动更改图标。

例如,

ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeAsUpIndicator(R.drawable.ic_drawer);

并且

ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(...){};
mDrawerToggle.setHomeAsUpIndicator(R.drawable.ic_drawer_toggle);

4
请确保包含以下内容以正确同步图标的状态。
@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);
    mDrawerToggle.onConfigurationChanged(newConfig);
}

3
ActionBarDrawerToggle的初始化下面,写入以下代码:
toolbar.setNavigationIcon(R.drawable.ic_menu_camera);

在我看来,最好的答案是 - Skullper

2
这里是一个可行的解决方案:
    setSupportActionBar(toolbar2);
    toggle = new ActionBarDrawerToggle(this,drawerLayout,toolbar2, R.string.navigation_drawer_open,R.string.navigation_drawer_close);

    bottomNavigationView.setOnNavigationItemSelectedListener(this);
    navigationView=findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);

    toggle.syncState();

    //------------To change Navigation drawer icon ---------------//
    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

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

这个Youtube视频有助于 https://www.youtube.com/watch?v=biUaIO-N7Ew


1
 mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
            R.drawable.hamburger_button(This you the icon), //nav menu toggle icon
            R.string.app_name, // nav drawer open - description for accessibility
            R.string.app_name // nav drawer close - description for accessibility
            )

8
这已经被弃用,建议改用v7版本,而且v7ActionBarToggle没有更改图标的构造函数。 - user2968401
1
使用v7 ActionBarDrawerToggle更改图标的方法:https://dev59.com/TmAf5IYBdhLWcg3wlDmb#32117399 - Mateus Gondim

1
对我来说,添加setHomeAsUpIndicator起了作用。
mDrawerToggle = new ActionBarDrawerToggle(
            this,                  /* host Activity */
            mDrawerLayout,         /* DrawerLayout object */
            R.drawable.custom_icon,  /* nav drawer image to replace 'Up' caret */
            R.string.drawer_open,  /* "open drawer" description for accessibility */
            R.string.drawer_close  /* "close drawer" description for accessibility */
    ) {
        public void onDrawerClosed(View view) {
            getSupportActionBar().setTitle(mTitle);
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        }

        public void onDrawerOpened(View drawerView) {
            getSupportActionBar().setTitle(mDrawerTitle);
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        }
    };
    mDrawerLayout.setDrawerListener(mDrawerToggle);

    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setHomeButtonEnabled(true);
    getSupportActionBar().setHomeAsUpIndicator(R.drawable.custom_icon);

1

调用ActionBarDrawerToggle的父类方法super.onDrawerClosed(view)super.onDrawerOpened(drawerView),例如

mDrawerToggle = new ActionBarDrawerToggle(...){
        public void onDrawerClosed(View view) 
         {
           super.onDrawerClosed(view);
           //---your code
         }

        public void onDrawerOpened(View drawerView) 
         {
           super.onDrawerOpened(drawerView);
           //---your code
         }
 }

0

首先,在清单文件中尝试使用此代码:

android:icon="@drawable/ic_icon1" 

这是你的应用程序总标志的图像

android:logo="@drawable/ic_drower" 

这是操作栏的图片

然后在主活动中尝试使用以下代码:

actionBar.setDisplayUseLogoEnabled(true);

0
setSupportActionBar(yourToolbar);
yourToolbar.setNavigationIcon({yourDrawable});

在setSupportActionBar()之前不要设置导航图标


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