2013-07-25 10 views
56

Mam aplikację, w której chcę zaimplementować podwójną szufladę - jedną z lewej i jedną z prawej. Lewa szuflada służy do nawigacji w aplikacji, prawy szuflada służy do filtrowania wyników.DrawerLayout Double Drawer (lewa i prawa szuflady jednocześnie)

więc układ jest tak:

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

Widać tu „left_drawer” i „right_drawer”, a ich odpowiednie grawitacji - „start” i „koniec” I to naprawdę działa! Możesz je wyciągnąć.

Problem polega na tym, że gdy wdrażam DrawerToggle - otwiera tylko lewą szufladę i nie zamyka prawej, więc jeśli prawą szufladę otworzył i wcisnąłem przycisk DrawerToggle - lewa szuflada otwiera się TAKŻE, zachodzi na prawą szufladę.

Istnieje kilka rozwiązań I'am próbuje dostać:

  1. Zrób sam przycisk DrawerToggle po prawej stronie, a tym samym zachowanie i animacji, jak po lewej stronie.
  2. Ustaw szufladę po przeciwnej stronie szuflady, którą próbuję otworzyć - automatycznie zamknij (jeśli lewa szuflada jest otwarta i naciskasz przełącznik prawej szuflady i vise-versa).

I nie zorientowali, jak to zrobić, ponieważ DrawerToggle akceptuje DrawerLayout sama jako parametr, a nie poszczególne szuflady ...

Używam Library Support.

Ktoś ma jakieś pomysły? Z góry dziękuję.

Odpowiedz

21

można nazwać tak w obsługi danego ToggleButton dla przykładu:

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

Gdzie mDrawer jest odniesienie do konkretnej szuflady trzeba otworzyć (czy to widok lub układ), w przypadku , rzeczywisty ListView, który chcesz wyświetlić.

0

Mam rozwiązać dodając ten kod w onOptionsItemSelected metody:

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

Dodałem przycisk działania i overrided przycisk home na actionbar

34

Oto kod dla działalności podwójny szuflady niż można rozszerzyć o inne działania w celu realizacji podwójnej szuflady, zakładając, że mają one układ podobny do tego, który proponuje OP.

public class DoubleDrawerActivity extends ActionBarActivity { 

    private DrawerLayout mDrawerLayout; 
    private ActionBarDrawerToggle mDrawerToggle; 
    private View mLeftDrawerView; 
    private View mRightDrawerView; 

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

     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setHomeButtonEnabled(true); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 

     if(mDrawerLayout == null || mLeftDrawerView == null || mRightDrawerView == null || mDrawerToggle == null) { 
      // Configure navigation drawer 
      mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
      mLeftDrawerView = findViewById(R.id.left_drawer); 
      mRightDrawerView = findViewById(R.id.right_drawer); 
      mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_navigation_drawer, R.string.drawer_open, R.string.drawer_close) { 

       /** Called when a drawer has settled in a completely closed state. */ 
       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. */ 
       public void onDrawerOpened(View drawerView) { 
        if(drawerView.equals(mLeftDrawerView)) { 
         getSupportActionBar().setTitle(getString(R.string.app_name)); 
         supportInvalidateOptionsMenu(); // creates call to onPrepareOptionsMenu() 
         mDrawerToggle.syncState(); 
        }     
       } 

       @Override 
       public void onDrawerSlide(View drawerView, float slideOffset) { 
        // Avoid normal indicator glyph behaviour. This is to avoid glyph movement when opening the right drawer 
        //super.onDrawerSlide(drawerView, slideOffset); 
       } 
      }; 

      mDrawerLayout.setDrawerListener(mDrawerToggle); // Set the drawer toggle as the DrawerListener 
     } 
    } 

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

     // Sync the toggle state after onRestoreInstanceState has occurred. 
     mDrawerToggle.syncState(); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 

     mDrawerToggle.onConfigurationChanged(newConfig); 
    } 

    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 

     // If the nav drawer is open, hide action items related to the content view 
     for(int i = 0; i< menu.size(); i++) 
      menu.getItem(i).setVisible(!mDrawerLayout.isDrawerOpen(mLeftDrawerView)); 

     return super.onPrepareOptionsMenu(menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     switch(item.getItemId()) { 
      case android.R.id.home: 
       mDrawerToggle.onOptionsItemSelected(item); 

       if(mDrawerLayout.isDrawerOpen(mRightDrawerView)) 
        mDrawerLayout.closeDrawer(mRightDrawerView); 

       return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 
+0

Zapomniałem powiedzieć, że to sprawia, że ​​korzystanie z pomocy v7 AppCompat lib http://developer.android.com/tools/support-library/features.html –

+6

też jeśli chcesz glyphe poruszać tylko dla lewej szufladzie, można to zrobić w metodzie onDrawerSlide: \t \t \t \t \t if (drawerView == leftDrawer) super.onDrawerSlide (drawerView, slideOffset); –

+1

@ DanielLópezLacalle Dziękuję za odpowiedź. Podążyłem za twoim kodem i nie dostarczyłem żadnych błędów, ale nawet po tym oświadczeniu widać wszystko po prawej stronie paska akcji ... nic. – Abstract

6

Oto moje krótkie rozwiązanie dla wszystkich, którzy chcą zapobiec animacji wskaźnika szuflady, jeśli przesuwają odpowiedni widok. Po prostu zaimplementuj metodę podobną do tej: onDrawerSlide.

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

Stosując to podejście, animacja zatrzymuje się, ale glif (ikona) przeskakuje teraz do pozycji, do której normalnie się przesunie. co robisz, aby zapobiec ruchowi? –

5

Użyj grawitacji stałej (Gravity.LEFT lub Gravity.RIGHT) dowolnego szuflada chcesz zamknąć (jak otworzyć drugi) w onOptionsItemSelected(), jak pokazano poniżej.

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

mDrawerToggle = obiekt Listener wykonawczych DrawerLayout.DrawerListener
Patrz: http://developer.android.com/reference/android/support/v4/app/ActionBarDrawerToggle.html

0

uczynić element niestandardowy i dodać go prawo, przejść do niego odpowiednią szufladę.

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

Możesz użyć NavigationView z materiału.

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

uzyskać więcej informacji, zapoznaj http://v4all123.blogspot.in/2016/03/simple-example-of-navigation-view-on.html

Powiązane problemy