2013-10-06 66 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

相關問題