Comment détecter si le tiroir de navigation est ouvert?


89

Le titre explique tout. Tout ce que je veux faire, c'est savoir si le tiroir de navigation est ouvert ou non. J'ai beaucoup cherché sur le net et trouvé la méthodeisDrawerOpen(int drawerGravity) mais pas trouvé de réponse satisfaisante qui explique comment l'utiliser dans une méthode. J'apprécierais que quelqu'un me l'explique.

Merci d'avance!


3
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList). mDrawerLayout est le tiroir et mDrawerList est la liste
Raghunandan

@Raghunandan Merci beaucoup!
Chinmay Dabke

Réponses:


213

En supposant que vous ayez défini une disposition de tiroir en xml:

DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
...
if(mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
  //drawer is open
}

Cela signifie-t-il que le tiroir est ouvert?
Chinmay Dabke

8
Bien que cela puisse paraître évident pour beaucoup, j'aimerais souligner que isDrawerOpen (GravityCompat.END)) doit être utilisé si le tiroir est ouvert par la droite (c'est-à-dire android: layout_gravity = "right")
Hong

3
Si vous souhaitez fermer, vous devez ajouter ce commentaire dans if staments tiroir.closeDrawer (Gravity.START);
mehmet

32
 mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerToggle = new ActionBarDrawerToggle(
            this,                  /* host Activity */
            mDrawerLayout,         /* DrawerLayout object */
            R.drawable.ic_drawer,  /* nav drawer icon to replace 'Up' caret */
            R.string.drawer_open,  /* "open drawer" description */
            R.string.drawer_close  /* "close drawer" description */
            ) {

        /** Called when a drawer has settled in a completely closed state. */
        public void onDrawerClosed(View view) {
            super.onDrawerClosed(view);
            getActionBar().setTitle(mTitle);
        }

        /** Called when a drawer has settled in a completely open state. */
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            getActionBar().setTitle(mDrawerTitle);
        }
    };

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

Cet auditeur utilise :)


Merci mais je n'utilise pas de barre d'action avec un tiroir de navigation. Juste besoin de l'utiliser dans une méthode!
Chinmay Dabke

20

Utilisation:

mDrawerLayout.isDrawerOpen () Méthode

Exemple:

    if(mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
        mDrawerLayout.closeDrawer(Gravity.LEFT); //CLOSE Nav Drawer!
    }else{
        mDrawerLayout.openDrawer(Gravity.LEFT); //OPEN Nav Drawer!
    }

3
si le tiroir est ouvert, ouvrez le tiroir, sinon fermez le tiroir: D
ataulm

5

De la manière suivante, vous pouvez trouver que le tiroir est ouvert ou fermé.

 public class YourActivity extends AppCompatActivity implements  DrawerLayout.DrawerListener {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dash_board);

        DrawerLayout drawer=(DrawerLayout)findViewById(R.id.container);
        drawer.setDrawerListener(this);
    }//onCreate()

    @Override
    public void onDrawerOpened(View arg0) {
      //write your code
    }

    @Override
    public void onDrawerClosed(View arg0) {
        //write your code
    }

    @Override
    public void onDrawerSlide(View arg0, float arg1) {
        //write your code
    }

    @Override
    public void onDrawerStateChanged(int arg0) {
        //write your code
    }
}//class

Utilisez addDrawerListener car set est obsolète
SeaRoth

3

La réponse de shakeJ est la bonne, et rappelez-vous que vous pouvez utiliser onDrawerSlide pour pouvoir déclencher d'autres fonctions ... par exemple, je l'ai utilisé pour changer la couleur de la barre d'état.

        /** Called when a drawer has settled in a completely closed state. */
        public void onDrawerClosed(View view) {
            super.onDrawerClosed(view);
            isOpen = false;
        }

        /** Called when a drawer has settled in a completely open state. */
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            isOpen = true;
        }
        public void onDrawerSlide(View drawerView,float slideOffset){
            super.onDrawerSlide(drawerView,slideOffset);
            if(!isOpen){
                setStatusBarColor("#00102b");
            }
            if(isOpen){
                setStatusBarColor("#EFEFF0");
            }
        }

3

Détecter l' DrawerLayoutouverture, la fermeture et la glissière de DrawerLayout.DrawerListener

DrawerLayout drawerLayout:
drawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() {
    /**
     * Called when a drawer's position changes.
     *
     * @param slideOffset The new offset of this drawer within its range, from 0-1
     *                    Example when you slide drawer from left to right, slideOffset will increase from 0 - 1 (0 when drawer closed and 1 when drawer display full)
     */
    @Override
    public void onDrawerSlide(@NonNull View drawerView, float slideOffset) {

    }

    @Override
    public void onDrawerOpened(@NonNull View drawerView) {
        // do something when drawer opened
    }

    @Override
    public void onDrawerClosed(@NonNull View drawerView) {
        // do something when drawer closed
    }

    /**
     * Called when the drawer motion state changes. The new state will
     * be one of {@link #STATE_IDLE}, {@link #STATE_DRAGGING} or {@link #STATE_SETTLING}.
     */
    @Override
    public void onDrawerStateChanged(int newState) {

    }
});

Le tiroir à chèques est ouvert

if(drawerLayout.isDrawerOpen(GravityCompat.START)) // or  GravityCompat.END

1

La méthode est la même à Kotlin.

  1. Initialiser la vue DrawerLayout

    val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)

  2. Vérifiez si le tiroir est ouvert

    if(drawerLayout.isDrawerOpen(GravityCompat.START)){ Log.d("Drawer","open") }

Si vous souhaitez effectuer des actions automatiquement lorsque le tiroir est ouvert ou fermé, vous pouvez effectuer les opérations suivantes.

  1. Dans votre activité principale, créez une classe interne qui est une sous-classe de DrawerLayout.DrawerListener . La classe DrawerLayout implémente l'interface DrawerListener.

    inner class CustomDrawer : DrawerLayout.DrawerListener{
      override fun onDrawerStateChanged(newState: Int) {
      }
    
      override fun onDrawerSlide(drawerView: View, slideOffset: Float) {
        imm.hideSoftInputFromWindow(drawerView?.getWindowToken(), 0)
      }
    
      override fun onDrawerClosed(drawerView: View) {
        imm.hideSoftInputFromWindow(drawerView?.getWindowToken(), 0)
      }
    
      override fun onDrawerOpened(drawerView: View) {
        imm.hideSoftInputFromWindow(drawerView?.getWindowToken(), 0)
      }
    }
  2. Mettez votre action dans la fonction que vous souhaitez utiliser. Dans mon exemple, je ferme le clavier virtuel si l'utilisateur interagit avec le tiroir de navigation. Déclarez InputMethodManager comme ceci dans votre activité principale:

    var imm: InputMethodManager = this.getSystemService(Activity.INPUT_METHOD_SERVICE)

  3. Ajoutez votre DrawerListener personnalisé au tiroirLayout (je l'ai mis dans la méthode onCreate)

    var drawerListener = CustomDrawer() drawerLayout.addDrawerListener(drawerListener)


1

Peut-être, je suis en retard mais je peux partager de nouvelles informations mises à jour. Dans le code donné, j'ai défini le tiroir ouvert / fermé dans la fonction onclick.Si le tiroir est ouvert, il sera fermé sinon ouvert.Cette solution est basée sur RXava DrawerLayout (androidx.drawerlayout.widget.DrawerLayout). Dans mon code, j'ouvre la disposition des tiroirs de droite à gauche.

 @Override
    public void onClick(View view) {

  if (drawerLayout.isDrawerVisible(GravityCompat.END)) {
                    drawerLayout.closeDrawer(GravityCompat.END);
  }else {
                    drawerLayout.openDrawer(GravityCompat.END);
  }

}

Remarque: Si vous ouvrez tiroirLayout depuis le côté droit, utilisez "GravityCompat.END" et il est ouvert depuis le côté gauche, utilisez "GravityCompat.START" . Profitez du codage .....

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.