今天在查找DrawerLayout的自定义菜单的实现时,偶然发现了ActionBarDrawerToggle这个东西。这个类的用处是,在DrawerLayout被操作,如打开,关闭,或者滑动等行为时接收反馈而执行一定的操作。还有一个功能就是当导航页面切入切出时,导航图标实现动画效果。用过google play的同学应该见过,当左边的导航菜单被唤出的时候,左上角的三道杠的图标会通过动画变成一个向左的箭头,关闭菜单的时候又会从箭头变为三道杠。
很炫酷有木有!于是楼主去找了下攻略。。啊,是教程,知道了大略的做法,这里直接把重要代码贴出来吧
private Toolbar toolbar; private DrawerLayout mDrawer; private ActionBarDrawerToggle drawerToggle; drawerToggle = new ActionBarDrawerToggle(this,mDrawer,toolbar,R.string.drawer_open,R.string.drawer_close){ @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); invalidateOptionsMenu(); } @Override public void onDrawerClosed(View drawerView) { super.onDrawerClosed(drawerView); invalidateOptionsMenu(); } }; mDrawer.addDrawerListener(drawerToggle); drawerToggle.syncState();注意对象自己初始化,drawer_open那两个是字符串引用来的,addDrawerListener原来对应的是setDrawerListener,不过现在google已经废弃那个方法了,请使用现在这个。照着做了下,发现不对啊,根本没有动画效果啊!!不过监听导航菜单打开和关闭里面的话,确实是已经成功执行了。在google找了一下,终于是找到问题解决方案了,主要还是 drawerToggle.syncState();这句话,不过这样直接用没效果,正确用法是重写onPostCreate方法,如下: @Override protected void onPostCreate(@Nullable Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); drawerToggle.syncState(); } 再次运行,成功看到导航图标的动画效果了!
顺带说明,简单的让导航菜单可见的话,默认的是一个箭头,有的同学可能会觉得是不是要先用一个三道杠图标改掉这个图标啊?其实是没有必要的,只要能实现动画效果,箭头图标会自动改成三道杠的。
以上只是解决方法的其中一种,还有一种方法就不贴出来了,有兴趣的同学请自行查看。给出解决楼主问题的传送门:Drawer toggle not working as expected (icon remains the same)
