2013-10-06 40 views
0

所以我想要以打开它的方式为我的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 

我甚至尝试“getAnimation()”在DrawerLayout但它返回空,所以我不能用它来发布行动迟缓。

任何人有一个想法如何处理这个?我是否应该使用任意延迟,并希望它在所有设备上看起来都一样?有没有办法从听众内部关闭抽屉? 在此先感谢!

回答

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); 
+0

我最终选择了类似的解决方案。我不敢相信没有更好的方法来完成这个任务,但是 - 呃 - 有效,有效。谢谢! –

+0

@EladAvron有更多的优雅,就像在一个Activity中使用getContentView()。postDelayed(Runnable,int)中的构建一样? (你可以在任何视图上实际使用postDelayed) – Redwarp

相关问题