Como detectar se a gaveta de navegação está aberta?

89

O título explica tudo. Tudo o que quero fazer é saber se a gaveta de navegação está aberta ou não. Pesquisei muito na net e encontrei o método, isDrawerOpen(int drawerGravity)mas não encontrei uma resposta satisfatória que explicasse como usá-lo em um método. Eu apreciaria se alguém explicasse isso para mim.

Desde já, obrigado!

Chinmay Dabke
fonte
3
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList). mDrawerLayout é a gaveta e mDrawerList é a
visualização de
@Raghunandan Muito obrigado!
Chinmay Dabke de

Respostas:

213

Supondo que você tenha definido um layout de gaveta em xml:

DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
...
if(mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
  //drawer is open
}
Neoh
fonte
Isso significa que a gaveta está aberta?
Chinmay Dabke
8
Embora possa ser óbvio para muitos, gostaria de salientar que isDrawerOpen (GravityCompat.END)) deve ser usado se a gaveta for aberta da direita (ou seja, android: layout_gravity = "right")
Hong
3
Se você deseja fechar, você deve adicionar este comentário em 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);

Esse ouvinte usa :)

ShakeJ
fonte
Obrigado, mas não estou usando uma barra de ações com gaveta de navegação. Só preciso usá-lo em um método!
Chinmay Dabke
20

Usar:

mDrawerLayout.isDrawerOpen () Método

Exemplo:

    if(mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
        mDrawerLayout.closeDrawer(Gravity.LEFT); //CLOSE Nav Drawer!
    }else{
        mDrawerLayout.openDrawer(Gravity.LEFT); //OPEN Nav Drawer!
    }
Jorgesys
fonte
3
se a gaveta estiver aberta, abra a gaveta, do contrário feche a gaveta: D
ataulm
5

Da seguinte forma, você pode descobrir que a gaveta está aberta ou fechada.

 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
Gyan S Awasthi
fonte
Use addDrawerListener, pois set está obsoleto
SeaRoth
3

A resposta do shakeJ é a correta, e lembre-se que você pode usar o onDrawerSlide para disparar outras funções ... por exemplo, usei-o para alterar a cor do 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");
            }
        }
MontDeska
fonte
3

Detectar DrawerLayoutaberto, fechado, slide 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) {

    }
});

Verifique se a gaveta está aberta

if(drawerLayout.isDrawerOpen(GravityCompat.START)) // or  GravityCompat.END
Phan Van Linh
fonte
1

O método é o mesmo em Kotlin.

  1. Inicialize a visualização DrawerLayout

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

  2. Verifique se a gaveta está aberta

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

Se você deseja executar ações automaticamente quando a gaveta é aberta ou fechada, você pode fazer o seguinte.

  1. Em sua atividade principal, crie uma classe interna que é uma subclasse de DrawerLayout.DrawerListener . A classe DrawerLayout implementa a 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. Coloque sua ação na função que deseja usar. No meu exemplo, estou fechando o teclado virtual se o usuário interagir com a gaveta de navegação. Declare o InputMethodManager assim em sua atividade principal:

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

  3. Adicione seu DrawerListener personalizado ao drawerLayout (eu o coloquei no método onCreate)

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

Joe Muller
fonte
1

Pode ser, estou atrasado, mas posso compartilhar novas informações atualizadas. Em determinado código, eu defino abrir / fechar gaveta na função onclick. Se a gaveta for aberta, então ela será fechada senão aberta. Esta solução é baseada em RXava DrawerLayout (androidx.drawerlayout.widget.DrawerLayout). No meu código, abro o drawerlayout da direita para a esquerda.

 @Override
    public void onClick(View view) {

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

}

Nota: Se você abrir drawerLayout do lado direito, use "GravityCompat.END" e ele abrir do lado esquerdo, então use "GravityCompat.START" . Aproveite a codificação ...

Sistema zeloso
fonte