2013-07-20 40 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 

      } 
     } 
    } 
} 
相关问题