0

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

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

我真的不想使用任意长度的“延迟发布”,因为这看起来很脏。我已经尝试在侦听器中手动覆盖“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,所以我不能用它来发布延迟的动作。

任何人都知道如何解决这个问题?我是否应该使用任意延迟并希望它在所有设备上看起来都一样?有没有办法从听者内部关闭抽屉?提前致谢!

4

1 回答 1

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);
于 2013-10-06T18:17:27.297 回答