¿Cómo detectar si el cajón de navegación está abierto?


89

El título lo explica todo. Todo lo que quiero hacer es saber si el cajón de navegación está abierto o no. Busqué mucho en la red y encontré el método, isDrawerOpen(int drawerGravity)pero no pude encontrar una respuesta satisfactoria que explique cómo usarlo en un método. Agradecería que alguien me lo explicara.

¡Gracias por adelantado!


3
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList). mDrawerLayout es el cajón y mDrawerList es la vista de lista
Raghunandan

@Raghunandan ¡Muchas gracias!
Chinmay Dabke

Respuestas:


213

Suponiendo que haya definido un diseño de cajón en xml:

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

¿Significa esto que el cajón está abierto?
Chinmay Dabke

8
Aunque puede ser obvio para muchos, me gustaría señalar que se debe usar isDrawerOpen (GravityCompat.END)) si el cajón se abre desde la derecha (es decir, android: layout_gravity = "right")
Hong

3
Si desea cerrar, debe agregar este comentario en 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);

Ese oyente usa :)


Gracias, pero no estoy usando una barra de acciones con cajón de navegación. ¡Solo necesito usarlo en un método!
Chinmay Dabke

20

Utilizar:

mDrawerLayout.isDrawerOpen () método

Ejemplo:

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

3
si el cajón está abierto, abra el cajón, de lo contrario cierre el cajón: D
ataulm

5

De la siguiente manera puede encontrar que el cajón está abierto o cerrado.

 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

Use addDrawerListener ya que el conjunto está obsoleto
SeaRoth

3

La respuesta de shakeJ es la correcta, y recuerde que puede usar onDrawerSlide para poder activar otras funciones ... por ejemplo, lo usé para cambiar el Color de la barra de estado.

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

Detectar DrawerLayout.DrawerListenerDrawerLayout abierto, cerrado y deslizante

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) {

    }
});

Compruebe que el cajón está abierto

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

1

El método es el mismo en Kotlin.

  1. Inicializar la vista DrawerLayout

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

  2. Compruebe si el cajón está abierto

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

Si desea realizar acciones automáticamente cuando se abre o se cierra el cajón, puede hacer lo siguiente.

  1. En su actividad principal, cree una clase interna que sea una subclase de DrawerLayout.DrawerListener . La clase DrawerLayout implementa la interfaz 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. Pon tu acción en la función que quieras usar. En mi ejemplo, cierro el teclado en pantalla si el usuario interactúa con el cajón de navegación. Declare el InputMethodManager así en su actividad principal:

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

  3. Agregue su DrawerListener personalizado al drawerLayout (lo puse en el método onCreate)

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


1

Puede ser, llegué tarde pero puedo compartir nueva información actualizada. En el código dado, configuro abrir / cerrar el cajón en la función onclick. Si el cajón está abierto, se cerrará de lo contrario se abrirá. Esta solución se basa en RXava DrawerLayout (androidx.drawerlayout.widget.DrawerLayout). En mi código, abro Drawerlayout de derecha a izquierda.

 @Override
    public void onClick(View view) {

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

}

Nota: Si abre DrawerLayout desde el lado derecho, use "GravityCompat.END" y está abierto desde el lado izquierdo, luego use "GravityCompat.START" . Disfruta codificando .....

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.