【问题标题】:Changing Navigation drawer icon on action bar android更改操作栏android上的导航抽屉图标
【发布时间】:2014-06-30 04:10:39
【问题描述】:

我使用 ActionBar 在我的应用程序中创建了 NavigationDrawer。

如上图所示,我想将 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提供的不一样?
  • 是的。这是我的自定义图片。
  • stackoverflow.com/questions/9252354/… 请在此链接中抢购
  • @HakHak 这行得通。非常感谢。请发布答案,以便我接受。还知道如何将应用标题放在操作栏的中心吗?
  • @user3713706 不需要队友..因为我也在做那件事并且能够让它工作我只是希望它可以帮助你快乐编码:)

标签: android android-actionbar icons navigation-drawer


【解决方案1】:

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

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

【讨论】:

  • 自定义图标的大小应该是多少?
  • 完美答案,其中包括重要的导航侦听器,否则图标点击被视为返回。
  • 不完美。为什么不支持动态大小?
  • 这解决了我的问题
【解决方案2】:

尝试使用 setHomeAsUpIndicator() 手动更改图标。

喜欢,

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

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

【讨论】:

    【解决方案3】:

    请确保包含这些以正确同步图标的状态。

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

    【讨论】:

      【解决方案4】:

      像调用ActionBarDrawerTogglesuper.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
               }
       }
      

      【讨论】:

        【解决方案5】:

        这是一个可行的解决方案:

            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

        【讨论】:

          【解决方案6】:
           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
                      )
          

          【讨论】:

          • 这已被弃用,取而代之的是 v7,并且 v7ActionBarToggle 没有构造函数来更改图标。
          • 使用 v7 ActionBarDrawerToggle 更改图标:stackoverflow.com/a/32117399/3752244
          【解决方案7】:

          对我来说,添加 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);
          

          【讨论】:

            【解决方案8】:

            ActionBarDrawerToggle的初始化下编写如下代码:

            toolbar.setNavigationIcon(R.drawable.ic_menu_camera);
            

            【讨论】:

              【解决方案9】:

              首先,您应该在清单中尝试以下代码:

              android:icon="@drawable/ic_icon1" 
              

              这是您应用的总徽标图片

              android:logo="@drawable/ic_drower" 
              

              这是操作栏的图片

              之后在 main-activity 中尝试以下代码:

              actionBar.setDisplayUseLogoEnabled(true);
              

              【讨论】:

                【解决方案10】:
                setSupportActionBar(yourToolbar);
                yourToolbar.setNavigationIcon({yourDrawable});
                

                不要在 setSupportActionBar() 之前设置 Navigation Icon

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-06-06
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多