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的答案)。非常感谢。官方文件()误导了我,浪费了我几个小时。现在,代码简单多了,一切都很完美。