2013-07-20 41 views
3

在我看來,DrawerLayout實現中缺少一件事情:以及在抽屜打開之前觸發的事件。DrawerLayout打開之前的事件

drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) { 
    public void onDrawerClosed(View view) { 
    //... 
    } 

    public void onBeforeDrawerOpened(View drawerView) { 
    //... 
    } 

    public void onDrawerOpened(View drawerView) { 
    //... 
    } 
}; 

之所以需要它是設置了選擇,啓用和類似像菜單項的抽屜項目的狀態。把它放到onDrawerOpened()的回調函數中,但它在打開後改變菜單的外觀並不太合適。

我的第一個想法是延長ActionBarDrawerToggle並提供新的事件。我應該重新發明輪子:-)還是已經有人完成了這個工作?

+1

附錄:它發生在我使用'onDrawerStateChanged()''時== newState但DrawerLayout.STATE_DRAGGING'它似乎被稱爲在兩個方向,也當抽屜關閉。 –

回答

5

此鏈接可以幫助您解決您的問題。 How to detect that the DrawerLayout started opening?

使用onDrawerStateChanged(int newState)回調

你要聽STATE_SETTLING狀態 - 這個狀態是 報道抽屜時開始移動(無論是打開或關閉)。所以 一旦你看到這種狀態 - 檢查抽屜是否現在打開和行動 相應:

mDrawerToggle = new ActionBarDrawerToggle(
     this,     
     mDrawerLayout,   
     R.drawable.ic_drawer, 
     R.string.drawer_open, 
     R.string.drawer_close 
) { 
    @Override 
    public void onDrawerStateChanged(int newState) { 
     if (newState == DrawerLayout.STATE_SETTLING) { 
      if (!isDrawerOpen()) { 
       // starts opening 
       getActionBar() 
         .setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 
      } else { 
       // closing drawer 
       getActionBar() 
         .setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
      } 
      invalidateOptionsMenu(); 
     } 
    } 
}; 
mDrawerLayout.setDrawerListener(mDrawerToggle); 
2

我在google上發現了這個問題,當我遇到這個問題時,並沒有在任何地方找到確切的答案,所以我決定我會發布完整的答案。希望它能夠節省一些時間。

我發現的最佳解決方案是監視抽屜狀態,並使用isDrawerOpen方法確定它是打開還是關閉。請務必將重力設置爲與打開/關閉抽屜時使用的重力相匹配。

DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
// ... 
ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, 
R.drawable.ic_playlist, R.string.drawer_open, R.string.drawer_close) { 
    public void onDrawerStateChanged(int newState) { 
     if(newState == DrawerLayout.STATE_DRAGGING){ 
      if(mDrawerLayout.isDrawerOpen(Gravity.LEFT)){ 
       //closing 

      }else{ 
       //opening 

      } 
     } 
    } 
} 
相關問題