2013-07-25 12 views
56

Ho un'applicazione, in cui voglio implementare un doppio cassetto: uno da sinistra e uno da destra. Il cassetto sinistro è per la navigazione delle app, il cassetto destro è per il filtraggio dei risultati.DrawerLayout Double Drawer (Cassetti sinistro e destro contemporaneamente)

Così, il layout è simile a questo:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    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" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@color/light_grey" 
     android:orientation="vertical"> 

     <GridView 
      android:id="@+id/gridview" 
      style="@style/GridViewStyle" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:gravity="center" 
      android:horizontalSpacing="7dp" 
      android:stretchMode="columnWidth" 
      android:verticalSpacing="7dp" /> 
    </LinearLayout> 

    <ListView 
     android:id="@+id/left_drawer" 
     android:layout_width="240dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:background="#111" 
     android:choiceMode="singleChoice" 
     android:divider="@android:color/transparent" 
     android:dividerHeight="0dp" /> 

    <ListView 
     android:id="@+id/right_drawer" 
     android:layout_width="240dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="end" 
     android:background="#111" 
     android:choiceMode="singleChoice" 
     android:divider="@android:color/transparent" 
     android:dividerHeight="0dp" /> 
</android.support.v4.widget.DrawerLayout> 

Si può vedere chiaramente qui "left_drawer" e "right_drawer", e le loro rispettive gravità - "start" e "fine" E questo funziona davvero! Puoi estrarli entrambi.

Il problema è che quando implemento DrawerToggle, apre solo il cassetto sinistro e non chiude quello destro, quindi se il cassetto destro viene aperto e premo il pulsante DrawerToggle, i cassetti di sinistra si aprono ANCHE, e si sovrappone al cassetto giusto.

ci sono un paio di soluzioni i'am cercare di ottenere:

  1. fare lo stesso tasto DrawerToggle sul lato destro, con lo stesso comportamento e l'animazione come il lato sinistro.
  2. Rendere il cassetto sul lato opposto del cassetto che sto tentando di aprire, chiudere automaticamente (se il cassetto sinistro è aperto e si preme l'interruttore del cassetto destro e viceversa).

E non ho capito come fare, perché DrawerToggle accetta la stessa DrawerLayout come parametro, e non i singoli cassetti ...

Sto usando la libreria di supporto.

Qualcuno ha qualche idea? Grazie in anticipo.

risposta

21

Si può chiamare come questo in gestore di un ToggleButton per esempio:

mDrawerLayout.openDrawer(mDrawer); 
mDrawerLayout.closeDrawer(mDrawer); 

Dove mDrawer è un riferimento al cassetto specifica è necessario aprire (sia esso una vista o un layout), nel tuo caso , il ListView attuale che desideri visualizzare.

0

ho risolto aggiungendo questo codice nel metodo onOptionsItemSelected:

switch (item.getItemId()) { 
    case android.R.id.home: 
     if (mDrawerLayout.isDrawerOpen(mDrawerList_right)){ 
      mDrawerLayout.closeDrawer(mDrawerList_right); 
     } 
     mDrawerLayout.openDrawer(mDrawerList_left); 
    } 
    break; 
case R.id.action_drawer: 
     if (mDrawerLayout.isDrawerOpen(mDrawerList_left)){ 
      mDrawerLayout.closeDrawer(mDrawerList_left); 
     } 
     mDrawerLayout.openDrawer(mDrawerList_right); 
    } 
default: 
    break; 
} 

ho aggiunto un pulsante di azione e overrided il tasto Home del ActionBar

34

Ecco il codice per un'attività doppio cassetto di può essere esteso da altre attività per implementare il doppio cassetto, assumendo che abbiano un layout come quello proposto da OP.

+0

dimenticato di dire che questo si avvale del supporto v7 appcompat lib http://developer.android.com/tools/support-library/features.html –

+6

anche , se si desidera che il glyphe di muoversi per il cassetto a sinistra solo, si può fare nel metodo onDrawerSlide: \t \t \t \t \t se (drawerView == leftDrawer) super.onDrawerSlide (drawerView, slideOffset); –

+1

@ DanielLópezLacalle Grazie per la tua risposta .. ho seguito il tuo codice e non ha dato alcun errore ma anche dopo che il suo dosaggio mostra qualcosa nella parte destra della mia barra delle azioni ... niente del tutto. – Abstract

6

Ecco la mia soluzione corta per tutti coloro che desiderano impedire l'animazione dell'indicatore del cassetto se passano la vista destra. È sufficiente implementare il metodo onDrawerSlide in questo modo.

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer_white, 0, 0) { 

    @Override 
    public void onDrawerClosed(View view) { 
     invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
    } 

    @Override 
    public void onDrawerOpened(View drawerView) { 
     invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
    } 

    @Override 
    public void onDrawerSlide(View drawerView, float slideOffset) { 
     if (drawerView == mSlidingMenuNavigationList) { 
      super.onDrawerSlide(drawerView, slideOffset); 
     } 
     else { 
      // do nothing on all other views 
     } 
    } 
}; 
+1

Utilizzando questo approccio, l'animazione si ferma ma il glifo (icona) ora salta alla posizione in cui normalmente scorre. cosa fai per prevenire la mossa tutti insieme? –

5

Utilizzare la gravità costante (Gravity.LEFT o Gravity.RIGHT) di qualsiasi cassetto che si desidera chiudere (come si apre l'altro) in onOptionsItemSelected() come illustrato di seguito.

public boolean onOptionsItemSelected(MenuItem item) { 
    if (mDrawerToggle.onOptionsItemSelected(item)) { 

     // Close the right side drawer if visible 
     if(mDrawerLayout.isDrawerVisible(Gravity.RIGHT)) { 
      mDrawerLayout.closeDrawer(Gravity.RIGHT); 
     } 
     return true; 
    } 

    // Regular stuff 
    switch (item.getItemId()) { 
    case R.id.action_example: 
     Toast.makeText(getActivity(), "Example action.", Toast.LENGTH_SHORT).show(); 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

oggetto mDrawerToggle = Listener attuazione DrawerLayout.DrawerListener
See: http://developer.android.com/reference/android/support/v4/app/ActionBarDrawerToggle.html

0

fanno un elemento personalizzato e aggiungerlo il diritto, passare ad esso il cassetto di destra.

final ToggleButton ic_nav = (ToggleButton) customNav.findViewById(R.id.ic_nav); 

     ic_nav.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View arg0) 
      { 
       if (mDrawerLayout.isDrawerOpen(mDrawerList) && arg0.isSelected()) { 
        mDrawerLayout.closeDrawer(mDrawerList); 
        arg0.setSelected(false); 
       } 
       else if (!mDrawerLayout.isDrawerOpen(mDrawerList) && !arg0.isSelected()){ 
        mDrawerLayout.openDrawer(mDrawerList); 
        ic_nav.setSelected(false); 
        arg0.setSelected(true); 
       } 
      } 
     }); 
7

È possibile utilizzare NavigationView dal modello del materiale.

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:openDrawer="start"> 

    <include 
     layout="@layout/app_bar_main" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

    <android.support.design.widget.NavigationView 
     android:id="@+id/nav_view" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:fitsSystemWindows="true" 
     app:headerLayout="@layout/nav_header_main" 
     app:menu="@menu/activity_main_drawer" /> 

    <android.support.design.widget.NavigationView 
     android:id="@+id/nav_view2" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="end" 
     android:fitsSystemWindows="true" 
     app:headerLayout="@layout/nav_header_main" 
     app:menu="@menu/activity_main_drawer1" /> 

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

Per ulteriori informazioni, si prega di fare riferimento http://v4all123.blogspot.in/2016/03/simple-example-of-navigation-view-on.html

Problemi correlati