Tiroir double tiroir (tiroirs gauche et droit simultanément)

J’ai une application dans laquelle je souhaite implémenter un double tiroir: un à gauche et un à droite. Le tiroir de gauche est pour la navigation de l’application, le tiroir de droite est pour le filtrage des résultats.

Donc, la mise en page est comme ceci:

        

Vous pouvez clairement voir ici “left_drawer” et “right_drawer”, et leur gravité respective – “start” et “end” Et cela fonctionne réellement! Vous pouvez les retirer tous les deux.

Le problème est que lorsque j’implémente le DrawerToggle – il n’ouvre que le tiroir de gauche et ne ferme pas celui de droite, donc si le tiroir de droite est ouvert et que j’appuie sur le bouton DrawerToggle – les tiroirs de gauche .

Il y a quelques solutions que j’essaie d’obtenir:

  1. Faites le même bouton DrawerToggle sur le côté droit, avec le même comportement et la même animation que le côté gauche.
  2. Faire le tiroir sur le côté opposé du tiroir que je tente d’ouvrir – ferme automatiquement (si le tiroir de gauche est ouvert et que j’appuie sur la bascule du tiroir droit et vice-versa).

Et je n’ai pas compris comment faire, car DrawerToggle accepte le DrawerLayout lui-même en tant que paramètre, et non les tiroirs individuels …

J’utilise la bibliothèque de support.

Quelqu’un a des idées? Merci d’avance.

Vous pouvez l’appeler ainsi dans un gestionnaire de ToggleButton, par exemple:

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

Où mDrawer est une référence au tiroir spécifique que vous devez ouvrir (que ce soit une vue ou une mise en page), dans votre cas, le ListView que vous souhaitez afficher.

Voici le code pour une activité à double tiroir qui peut être étendu par d’autres activités pour implémenter le double tiroir, en supposant qu’ils aient une disposition comme celle proposée par 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.ssortingng.drawer_open, R.ssortingng.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(getSsortingng(R.ssortingng.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); } } 

Vous pouvez utiliser NavigationView partir de la conception matérielle.

       

pour plus d’informations s’il vous plaît se référer http://v4all123.blogspot.in/2016/03/simple-example-of-navigation-view-on.html

Voici ma solution courte pour tous ceux qui veulent empêcher l’animation de l’indicateur de tiroir s’ils glissent la bonne vue. Implémentez simplement la méthode onDrawerSlide comme ceci.

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

Utilisez la constante de gravité (Gravity.LEFT ou Gravity.RIGHT) de n’importe quel tiroir que vous souhaitez fermer (lorsque vous ouvrez l’autre) dans onOptionsItemSelected () comme indiqué ci-dessous.

 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 = Objet Listener implémentant DrawerLayout.DrawerListener
Voir: http://developer.android.com/reference/android/support/v4/app/ActionBarDrawerToggle.html

J’ai résolu d’append ce code dans la méthode 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; } 

J’ai ajouté un bouton d’action et j’ai écrasé le bouton d’accueil de la barre d’action

faire un article personnalisé et l’append à droite, lui passer le bon tiroir.

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