Come rilevare se il cassetto di navigazione è aperto?


89

Il titolo spiega tutto. Tutto quello che voglio fare è sapere se il cassetto di navigazione è aperto o meno. Ho cercato molto in rete e ho trovato il metodo isDrawerOpen(int drawerGravity)ma non sono riuscito a trovare una risposta soddisfacente che spieghi come usarlo in un metodo. Apprezzerei se qualcuno me lo spiegasse.

Grazie in anticipo!


3
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList). mDrawerLayout è il drawer e mDrawerList è il listview
Raghunandan

@Raghunandan Grazie mille!
Chinmay Dabke

Risposte:


213

Supponendo che tu abbia definito un drawerlayout in xml:

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

Questo significa che il cassetto è aperto?
Chinmay Dabke

8
Sebbene possa essere ovvio per molti, vorrei sottolineare che isDrawerOpen (GravityCompat.END)) dovrebbe essere utilizzato se il cassetto viene aperto da destra (ad esempio android: layout_gravity = "right")
Hong

3
Se vuoi chiudere dovresti aggiungere questo commento in if staments drawer.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);

Quell'ascoltatore usa :)


Grazie ma non sto usando una barra delle azioni con il cassetto di navigazione. Ho solo bisogno di usarlo in un metodo!
Chinmay Dabke

20

Uso:

mDrawerLayout.isDrawerOpen () metodo

Esempio:

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

3
se il cassetto è aperto, apri il cassetto, altrimenti chiudi il cassetto: D
ataulm

5

Nel modo seguente puoi scoprire che il cassetto è aperto o chiuso.

 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

Usa addDrawerListener poiché set è deprecato
SeaRoth

3

La risposta di shakeJ è quella corretta e ricorda che puoi usare onDrawerSlide per poter attivare altre funzioni ... per esempio l'ho usato per cambiare il colore della StatusBar.

        /** 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

Rileva DrawerLayoutaperto, chiuso, scorrevole 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) {

    }
});

Verificare che il cassetto sia aperto

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

1

Il metodo è lo stesso in Kotlin.

  1. Inizializza la visualizzazione DrawerLayout

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

  2. Controlla se il cassetto è aperto

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

Se desideri eseguire azioni automaticamente quando il cassetto viene aperto o chiuso, puoi procedere come segue.

  1. Nella tua attività principale, crea una classe interna che sia una sottoclasse di DrawerLayout.DrawerListener . La classe DrawerLayout implementa l'interfaccia 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. Metti la tua azione nella funzione che vuoi usare. Nel mio esempio, chiudo la tastiera virtuale se l'utente interagisce con il cassetto di navigazione. Dichiara InputMethodManager in questo modo nella tua attività principale:

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

  3. Aggiungi il tuo DrawerListener personalizzato al drawerLayout (l'ho inserito nel metodo onCreate)

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


1

Forse sono in ritardo ma posso condividere nuove informazioni aggiornate. Nel codice dato, ho impostato apri / chiudi cassetto nella funzione onclick. Se il cassetto è aperto, verrà chiuso, altrimenti sarà aperto. Questa soluzione è basata su RXava DrawerLayout (androidx.drawerlayout.widget.DrawerLayout). Nel mio codice apro il drawerlayout da destra a sinistra.

 @Override
    public void onClick(View view) {

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

}

Nota: se apri drawerLayout dal lato destro usa "GravityCompat.END" ed è aperto dal lato sinistro, quindi usa "GravityCompat.START" . Buon divertimento ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.