打开DrawerLayout,执行操作,然后关闭它

时间:2013-10-06 16:11:55

标签: android animation drawerlayout

所以我想以这样一种方式为DrawerLayout设置动画,使其打开,将一个项目添加到其中的菜单中,然后关闭它。

我尝试了很多东西,但问题是“打开”和“关闭”命令之间没有延迟(或者至少没有明显的延迟),因此动画永远不会触发。

我真的不想使用任意长度的'post delayed',因为这看起来很脏。 我已经尝试在监听器中手动覆盖“onDrawerOpened()” - 这已经工作了,但是在执行操作后我无法关闭它,因为你无法从内部关闭它(意思是,如果'closeDrawer(布局) )'方法是从侦听器本身的任何子线程调用的,它会得到运行时错误。)

所以我拥有的是:

 _drawerToggle = new ActionBarDrawerToggle(MainActivity.this, _drawerLayout, R.drawable.ic_drawer, R.string.drawerOpen, R.string.drawerClose)
 {
      /** Called when a drawer has settled in a completely closed state. */
      public void onDrawerClosed(View view) {
           getActionBar().setTitle(_title);
      }

       /** Called when a drawer has settled in a completely open state. */
      public void onDrawerOpened(View drawerView) {
           myAction(); //My action                            
           //If I try to invoke 'drawerClose()' here or in my action, a runtime error occurs
      }
 };
 _drawerLayout.setDrawerListener(_drawerToggle);
 _drawerLayout.openDrawer(_mainFrame);
 //If I invoke 'drawerClose()' the entire thing is just too fast and the animations don't trigger

我甚至在DrawerLayout上尝试'getAnimation()'但它返回null,所以我不能用它来发布延迟动作。

任何人都知道如何处理这个问题?我应该使用任意延迟并希望它在所有设备上看起来都一样吗?有没有办法从听众中关闭抽屉? 提前谢谢!

1 个答案:

答案 0 :(得分:5)

调用closeDrawer()onDrawerOpened()中无效,因为抽屉尚未完成打开。如果您观看onDrawerStateChanged(),您会注意到在调用onDrawerOpened()后状态仍会发生变化。

onDrawerStateChanged()说抽屉闲置时我尝试关闭抽屉,但它仍然坠毁。正如你所说,我的最终解决方案看起来很糟糕。但它有效,看起来很流畅。这应该放在onDrawerOpened()

new Thread() {
    @Override
    public void run() {
        SystemClock.sleep(500);
        MainActivity.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mDrawerLayout.closeDrawers();
            }
        });
    }
}.start();

如果您使用某种排序或线程管理器(如此处发布的那种

),这可能看起来会好一些

https://gist.github.com/bclymer/6708605

免责声明,这是我的实用工具类。我在大多数应用程序中使用它,但它非常方便。使用该实用程序,代码看起来像

ThreadManager.delayOnMainThread(new Runnable() {
    @Override
    public void run() {
        mDrawerLayout.closeDrawers();           
    }
}, 500);