Android NavigationView和ActionBarDrawerToggle
使用新的Android NavigationView和ActionBarDrawerToggle,android,navigation-drawer,android-support-library,android-design-library,Android,Navigation Drawer,Android Support Library,Android Design Library,使用新的NavigationView是否仍建议使用ActionBarDrawerToggle或这不是“材料设计”?例如,以前我们应该在抽屉打开时隐藏动作条项目,但现在的指导方针说它们应该保留 使用新的NavigationView是否仍建议使用ActionBarDrawerToggle 对。这两个解决了导航抽屉的两个完全不同的方面 通常,导航抽屉共有三个组件: ADrawerLayout 您的导航抽屉内容 一种显示和隐藏抽屉的方法 DrawerLayout是保存导航抽屉内容和应用程序内容的布局
NavigationView
是否仍建议使用ActionBarDrawerToggle
或这不是“材料设计”?例如,以前我们应该在抽屉打开时隐藏动作条项目,但现在的指导方针说它们应该保留
使用新的NavigationView
是否仍建议使用ActionBarDrawerToggle
对。这两个解决了导航抽屉的两个完全不同的方面
通常,导航抽屉共有三个组件:
- A
DrawerLayout
- 您的导航抽屉内容
- 一种显示和隐藏抽屉的方法
DrawerLayout
是保存导航抽屉内容和应用程序内容的布局。它允许您从侧面将抽屉拉入,并在应用程序内容上方显示抽屉(抽屉布局的第一个子项)
导航抽屉内容(抽屉布局的第二个子项)通常是用户可以单击的项目列表。以前,我看到的大多数实现都使用了ListView
或RecyclerView
以及某种类型的头NavigationView
可替代此功能,用于提供符合物料要求的抽屉内容
ActionBarDrawerToggle
用于在应用程序栏中提供汉堡图标。它允许用户点击图标打开或关闭抽屉
使用新的NavigationView
是否仍建议使用ActionBarDrawerToggle
不需要
如果查看新设计库的“官方”,则不再使用ActionBarDrawerToggle
,因为新的NavigationView
和AppCompatActivity
实际上并不需要它
使用新的v22支持库,您可以去掉所有的ActionBarDrawerToggle
代码,只需使用以下操作即可处理NavigationDrawer
和ActionBar
/工具栏
汉堡图标之间的交互:
@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_菜单,在我的示例中为)。除此之外,上述代码是处理抽屉打开所需的全部代码。onOptionsItemSelected()
中的android.R.id.home
案例代表您的汉堡抽屉按钮。它指向一个内置的资源id(不是您添加到菜单xml中的东西),并且它是自动处理的
除此之外,只需将closeDrawers()
添加到单击侦听器,即可实现抽屉的关闭,如下所示:
navigationView.setNavigationItemSelectedListener(
new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(MenuItem menuItem) {
// Handle menu item clicks here.
drawerLayout.closeDrawers();
return true;
}
});
closeDrawers()
是抽屉布局的一种方法,可以处理所有的事情。就这样。这就是正确处理导航抽屉所需的全部代码。再也没有翻汉堡之类的乱七八糟的代码了
当然,如果您真的愿意,您仍然可以使用NavigationView
和ActionBarDrawerToggle
旧方法。但你当然不必这么做
如果需要抽屉回调
尽管打开/关闭抽屉不需要ActionBarDrawerToggle
,但它仍然有助于处理其他回调(尤其是在您已经使用ActionBar的情况下)。否则,您可以通过使用DrawerLayout.DrawerListener
或使用DrawerLayout.SimpleDrawerListener()
来实现自己的功能,以处理其他打开/关闭相关事件。完成其他答案,导航视图在高度上应适合整个屏幕,因此打开时将隐藏汉堡包图标。因此,从汉堡到箭头的动画甚至只是显示箭头都不是必需的
但是当点击当前屏幕时,它会进入另一个片段,想象一个照片库,点击一张照片会显示得更大,应该有一个从汉堡到箭头的动画,箭头应该保持不变,按下时应该有一个到汉堡的反向动画,这样导航视图可以再次打开
使用ActionBarDrawerToggle仍然可以实现这一点,即使使用导航视图也是如此,因为它使用了与以前相同的抽屉布局。因此,它仍然有用途,但当然不是必需的。ActionBarDrawerToggle的存在只是作为打开和关闭抽屉的侦听器。它还允许汉堡和箭头之间的动画存在。在导航视图中打开或关闭时不需要导航。如果我在应用程序中使用NavigationDrawer而不需要NavigationHeader怎么办?然后我会打开工具栏下面的抽屉。我应该使用ActionBarDrawerToggle打开和关闭抽屉吗?如果在工具栏下绘制NavigationDrawer,这听起来是仍然使用ActionBarDrawerToggle的一个很好的理由。我没有想到这个用例,但它看起来像是其他人想到的(参见@androidpotato7的答案)。非常感谢。官方文件()误导了我,浪费了我几个小时。现在,代码简单多了,一切都很完美。