使用新的NavigationView
还是建议使用ActionBarDrawerToggle
,或者这不是“ Material 设计”吗?例如,以前我们应该在打开抽屉时隐藏操作栏项目,但是现在准则要求它们应该保留。
最佳答案
不,不是必需的。
如果您查看新设计库的“官方” demo code,则不再使用ActionBarDrawerToggle
,因为新的NavigationView
和AppCompatActivity
并不需要它。
使用新的v22支持库,您可以剥离所有ActionBarDrawerToggle
代码,而只需使用以下内容即可处理NavigationDrawer
和ActionBar
/ToolBar
汉堡包图标之间的交互:
@Override
protected void onCreate(Bundle savedInstanceState) {
...
final ActionBar actionBar = getSupportActionBar();
actionBar.setHomeAsUpIndicator(R.drawable.ic_menu);
actionBar.setDisplayHomeAsUpEnabled(true);
...
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
mDrawerLayout.openDrawer(GravityCompat.START);
return true;
....
}
return super.onOptionsItemSelected(item);
}
您将需要提供自己的“汉堡”可绘制对象(在我的示例中为
R.drawable.ic_menu
)。除此之外,上面的代码是处理抽屉打开所需要的全部。 android.R.id.home
中的onOptionsItemSelected()
大小写代表您的汉堡抽屉按钮。它指向一个内置的资源ID(添加到菜单xml中的而不是),并且会自动处理。除此之外,您还需要通过简单地将
closeDrawers()
添加到您的点击监听器来实现抽屉的关闭,如下所示:navigationView.setNavigationItemSelectedListener(
new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
// Handle menu item clicks here.
drawerLayout.closeDrawers();
return true;
}
});
closeDrawers()
是DrawerLayout的一种方法,可以处理所有事情。就是这样。这就是您现在正确处理抽屉导航所需的全部代码。不再需要用于翻转汉堡包等的凌乱代码!当然,如果确实愿意,您仍然可以将
NavigationView
与ActionBarDrawerToggle
一起使用。但是您当然不必。如果要抽屉回调
即使打开/关闭抽屉不需要
ActionBarDrawerToggle
,它对于处理其他回调也仍然有用(特别是如果您已经在使用ActionBar的话)。否则,您可以使用DrawerLayout.DrawerListener
或DrawerLayout.SimpleDrawerListener()
来实现自己的功能,以处理其他与打开/关闭相关的事件。