8

我正在尝试更改汉堡包菜单图标NavigationView但我无法这样做。更改导航抽屉汉堡包图标

这是我迄今

我有一个基本活动,其中资产净值抽屉安装完成审判。下面是相关的代码

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    super.setContentView(R.layout.activity_base_nav); 
    setSupportActionBar(toolbar); 
    setupDrawer(); 
} 

private void setupDrawer() { 
    mDrawerLayout.setDrawerListener(this); 

    mDrawerToggle = new ActionBarDrawerToggle(this, 
      mDrawerLayout, 
      R.string.open, 
      R.string.close); 

    mDrawerToggle = new ActionBarDrawerToggle(mContext, 
      mDrawerLayout, 
      R.string.open, 
      R.string.close); 

    mDrawerLayout.setDrawerListener(mDrawerToggle); 

    if (getSupportActionBar() != null) { 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setDefaultDisplayHomeAsUpEnabled(false); 
     mDrawerToggle.setDrawerIndicatorEnabled(false); 
     mDrawerToggle.setHomeAsUpIndicator(R.drawable.ic_share_48pt_2x); 
    } 
    mDrawerToggle.syncState(); 

    mNavigationView.setNavigationItemSelectedListener(
      menuItem -> { 
       mMenuItem = menuItem.getItemId(); 
       mDrawerUtil.onNavMenuItemClicked(mMenuItem); 
       mDrawerLayout.closeDrawers(); 
       return true; 
      }); 
} 

@Override 
public void setContentView(int layoutResID) { 
    getLayoutInflater().inflate(layoutResID, mContainer); 
} 


@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    mDrawerToggle.syncState(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    mDrawerToggle.onConfigurationChanged(newConfig); 
} 

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

    return super.onOptionsItemSelected(item); 
} 

然而似乎是为我工作不。我也试过在SupportActionBar上拨打setDrawerIndicatorEnabled(false)setHomeAsUpIndicator(R.drawable.ic_share_48pt_2x),但那也行不通。

回答

20

下面的代码很好地工作对我来说,

protected void onCreate(Bundle savedInstanceState) { 
    ... 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setDefaultDisplayHomeAsUpEnabled(false); 
    toggle.setDrawerIndicatorEnabled(false); 
    toggle.setHomeAsUpIndicator(R.drawable.ic_custom_drawer_icon); 
    ... 
} 

我也不得不添加工具栏导航点击监听器听取自定义抽屉图标上的点击事件

protected void onCreate(Bundle savedInstanceState) { 
    ... 
    toggle.setToolbarNavigationClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
      if (drawer.isDrawerOpen(GravityCompat.START)) { 
       drawer.closeDrawer(GravityCompat.START); 
      } else { 
       drawer.openDrawer(GravityCompat.START); 
      } 
     } 
    }); 
    ... 
} 

最后,我可以更新动态图标作为

toggle.setHomeAsUpIndicator(R.drawable.ic_new_icon); 
+1

加入'@Override protected void onPostCreate(@Nullable Bundle savedInstanceState){ super.onPostCreate(savedInstanceState); nActionBarToggle.syncState(); } @Override public void onConfigurationChanged(Configuration newConfig){ super.onConfigurationChanged(newConfig); nActionBarToggle.onConfigurationChanged(newConfig); }'为我工作 – captaindroid

+0

感谢它为我工作 –

+0

我确实如此,但我的切换不可点击。 – Yar

0

您是否尝试查看文档? http://developer.android.com/training/implementing-navigation/nav-drawer.html

我发现这段代码在它:

mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 
       R.drawable.ic_drawer, 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() 
      } 
     }; 
+0

事情是我需要动态改变这个图标。我需要显示这个图标的通知数量。 –

+0

@AbhishekBansal我也需要在汉堡图标上显示通知的数量。你管理它了吗? –

13

只要使用此:

toolbar.post(new Runnable() { 
      @Override 
      public void run() { 
       Drawable d = ResourcesCompat.getDrawable(getResources(), R.mipmap.ic_launcher, null); 
       toolbar.setNavigationIcon(d); 
      } 
     }); 

你不需要处理setToolbarNavigationClickListener这是公认的答案。

+3

辉煌解决方案 –

+0

非常有效的解决方案。但是如何在点击时打开汉堡包按钮?它不会在任何地方转动,只是背景色被突出显示 – Zoffa

0

这里对我来说是什么在起作用:

override fun onCreate(savedInstanceState: Bundle?) { 
    super.onCreate(savedInstanceState) 
    setContentView(R.layout.activity_main) 
    setSupportActionBar(toolbar) 

    val toggle = ActionBarDrawerToggle(
      this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) 
    //toggle.isDrawerSlideAnimationEnabled = false 
    toggle.isDrawerIndicatorEnabled = false 
    toggle.setToolbarNavigationClickListener { 
     if (drawer_layout.isDrawerOpen(GravityCompat.START)) 
      drawer_layout.closeDrawer(GravityCompat.START) 
     else 
      drawer_layout.openDrawer(GravityCompat.START) 
    } 
    toggle.setHomeAsUpIndicator(AppCompatResources.getDrawable(this, R.drawable.ic_android_black_24dp)) 
    drawer_layout.addDrawerListener(toggle) 
    toggle.syncState() 
    nav_view.setNavigationItemSelectedListener(this) 
} 

override fun onBackPressed() { 
    if (drawer_layout.isDrawerOpen(GravityCompat.START)) { 
     drawer_layout.closeDrawer(GravityCompat.START) 
    } else { 
     super.onBackPressed() 
    } 
} 

override fun onNavigationItemSelected(item: MenuItem): Boolean { 
    when (item.itemId) { 
     ... 
    } 
    drawer_layout.closeDrawer(GravityCompat.START) 
    return true 
}