所以我想以这样一种方式为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,所以我不能用它来发布延迟动作。
任何人都知道如何处理这个问题?我应该使用任意延迟并希望它在所有设备上看起来都一样吗?有没有办法从听众中关闭抽屉? 提前谢谢!
答案 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);