2015-11-16 1 views
1

J'essaie de faire deux tiroirs de navigation dans mon application. Il est basé sur DrawerLayout Double Drawer (Left and Right Drawers simultaneously). Tout semble bien fonctionner en dehors de l'animation de la bascule du tiroir. Je le veux seulement pour le gauche et cela ne fonctionne que pour les deux ou aucun. Merci beaucoup!android deux animation de tiroir de navigation

Voici le code:

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); 
} 

Et voici le 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> 

Voici le drawer.xml de navigation droite

<?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> 

Et enfin le tiroir navigation gauche

<?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> 

Répondre

0

Votre déclaration if ne fonctionne pas comme prévu parce que les racines View s dans vos mises en page de tiroir inclus sont LinearLayout s, alors que le View s vous trouvez et l'affectation à mLeftDrawerView et mRightDrawerView dans votre code sont les ListView s. Le drawerView dans les différentes méthodes d'écoute sera la racine View des dispositions de tiroir inclus; c'est-à-dire les LinearLayout s. Cela signifie que drawerView == mLeftDrawerView ne sera jamais vrai.

La solution consiste à attribuer des ID au LinearLayout dans le fichier XML, trouver les View s dans le code, et les attribuer à mLeftDrawerView et mRightDrawerView.

Par exemple, votre mise en page du tiroir gauche:

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

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

</LinearLayout> 

Vous feriez la même chose avec la mise en page de tiroir de droite. Ensuite, lors de l'initialisation:

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); 
} 

Et vous devez également modifier le type déclaré pour mLeftDrawerView et mRightDrawerView à LinearLayout.

+1

Merci beaucoup Mike! Cela a fonctionné parfaitement !! – danman