2015-11-16 164 views
1

我想在我的应用中制作两个导航抽屉。它基于DrawerLayout Double Drawer (Left and Right Drawers simultaneously)。除了抽屉切换的动画之外,一切看起来都很好。我只希望它只适用于左边的一个,它只适用于两者或全部都不适用。非常感谢!android两个导航抽屉动画

下面的代码:

MainActivity(ProductsUI)

protected RecyclerView mProductsRecyclerView; 
protected SearchView mSearchView; 
protected ListView mRightDrawerView, mLeftDrawerView; 
protected DrawerLayout mDrawerLayout; 
protected ActionBarDrawerToggle mDrawerToggle; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 

    // Especificamos el layout 'products_grid.xml' 
    setContentView(R.layout.products_grid); 

    initActionBar(); 
    initRecyclerView(); 
    initNavigationDrawers(); 
} 
private void initActionBar() 
{ 
    // Cargamos la action bar personalizada 
    getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); 
    getSupportActionBar().setCustomView(R.layout.action_bar); 

    // Cargamos el boton del left drawer 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    getSupportActionBar().setHomeButtonEnabled(true); 
} 
private void initNavigationDrawers() 
{ 
    mRightDrawerView = (ListView)findViewById(R.id.rightlistviewdrawer); 
    mLeftDrawerView = (ListView)findViewById(R.id.leftlistviewdrawer); 
    mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout); 

    mRightDrawerView.setAdapter(menuAdapter); 
    mLeftDrawerView.setAdapter(menuAdapter); 

    initDrawerToggle(); 

    mDrawerLayout.setDrawerListener(mDrawerToggle); 
} 
private void initDrawerToggle() 
{ 
    // Inicializamos el navigation drawer y el control en la action bar 
    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.open_drawer, R.string.close_drawer) 
    { 
     // Called when a drawer has settled in a completely closed state 
     @Override 
     public void onDrawerClosed(View drawerView) 
     { 
      if(drawerView.equals(mLeftDrawerView)) 
      { 
       getSupportActionBar().setTitle(getTitle()); 
       supportInvalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
       mDrawerToggle.syncState(); 
      } 
     } 

     // Called when a drawer has settled in a completely open state 
     @Override 
     public void onDrawerOpened(View drawerView) 
     { 
      if(drawerView.equals(mLeftDrawerView)) 
      { 
       getSupportActionBar().setTitle(getString(R.string.app_name)); 
       supportInvalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
       mDrawerToggle.syncState(); 
      } 
     } 

     // Avoid normal indicator glyph behaviour. This is to avoid glyph movement when opening the right drawer 
     @Override 
     public void onDrawerSlide(View drawerView, float slideOffset) 
     { 
      if(drawerView == mLeftDrawerView) // THIS DOES NOT WORK (neither with equals()) 
       super.onDrawerSlide(drawerView, slideOffset); 
     } 
    }; 
} 
@Override 
protected void onPostCreate(Bundle savedInstanceState) 
{ 
    super.onPostCreate(savedInstanceState); 
    mDrawerToggle.syncState(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) 
{ 
    super.onConfigurationChanged(newConfig); 
    mDrawerToggle.onConfigurationChanged(newConfig); 
} 
@Override 
public boolean onOptionsItemSelected(MenuItem item) 
{ 
    if (mDrawerToggle.onOptionsItemSelected(item)) 
     return true; 

    // Funcionamiento del right drawer 
    if (item.getItemId() == R.id.right_drawer) { 
     if (mDrawerLayout.isDrawerOpen(Gravity.RIGHT)) 
      mDrawerLayout.closeDrawer(Gravity.RIGHT); 

     else 
      mDrawerLayout.openDrawer(Gravity.RIGHT); 

     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

而这里的products_grid.xml

<?xml version="1.0" encoding="utf-8"?> 

<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:orientation="vertical" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     tools:context=".ProductsUI" 
     android:background="@color/backgroundColorDark"> 

     <android.support.v7.widget.RecyclerView 
      android:id="@+id/grid_recycler" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_marginLeft="10dp" 
      android:layout_marginRight="10dp" 
      android:layout_marginBottom="10dp" 
      android:layout_marginTop="20dp" 
      android:scrollbars="none"/> 

    </LinearLayout> 

    <include layout="@layout/right_navigation_drawer"/> 

    <include layout="@layout/left_navigation_drawer"/> 

</android.support.v4.widget.DrawerLayout> 

这里的右侧导航drawer.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    android:layout_gravity="end"> 

    <ListView 
     android:id="@+id/rightlistviewdrawer" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:choiceMode="singleChoice" 
     android:dividerHeight="0dp" 
     android:background="@color/backgroundColorDark"/> 

</LinearLayout> 

最后左侧导航抽屉

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    android:layout_gravity="start"> 

    <ListView 
     android:id="@+id/leftlistviewdrawer" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:choiceMode="singleChoice" 
     android:dividerHeight="0dp" 
     android:background="@color/backgroundColorDark"/> 

</LinearLayout> 

回答

0

如您所愿,因为根View在你的抽屉里包含的布局LinearLayout S,你if声明不工作而View是你正在寻找和分配给mLeftDrawerView和您的代码中的mRightDrawerViewListView s。各种侦听器方法中的drawerView将成为所包含的抽屉布局的根View;即,LinearLayout。这意味着drawerView == mLeftDrawerView永远不会是真的。

解决的办法是分配ID到LinearLayout在XML,在代码找到那些View S,并分配到那些和mLeftDrawerViewmRightDrawerView

例如,你的左边抽屉布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/leftdrawer" 
    ... 
    > 

    <ListView 
     android:id="@+id/leftlistviewdrawer" 
     ... 
     /> 

</LinearLayout> 

你会做同样的与正确的抽屉布局。然后,在初始化:

private void initNavigationDrawers() { 
    mRightDrawerView = (LinearLayout)findViewById(R.id.rightdrawer); 
    mLeftDrawerView = (LinearLayout)findViewById(R.id.leftdrawer); 
    mRightDrawerListView = (ListView)findViewById(R.id.rightlistviewdrawer); 
    mLeftDrawerListView = (ListView)findViewById(R.id.leftlistviewdrawer); 

    mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout); 

    mRightDrawerListView.setAdapter(menuAdapter); 
    mLeftDrawerListView.setAdapter(menuAdapter); 

    initDrawerToggle(); 

    mDrawerLayout.setDrawerListener(mDrawerToggle); 
} 

而且你也需要改变声明的类型mLeftDrawerViewmRightDrawerViewLinearLayout

+1

非常感谢Mike!它完美的工作! – danman