Wie erkenne ich, ob die Navigationsschublade geöffnet ist?

89

Der Titel erklärt alles. Ich möchte nur wissen, ob die Navigationsschublade geöffnet ist oder nicht. Ich habe viel im Internet gesucht und die Methode gefunden isDrawerOpen(int drawerGravity), konnte aber keine zufriedenstellende Antwort finden, die erklärt, wie man sie in einer Methode verwendet. Ich würde mich freuen, wenn mir jemand das erklärt.

Danke im Voraus!

Chinmay Dabke
quelle
3
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList). mDrawerLayout ist die Schublade und mDrawerList ist die Listenansicht
Raghunandan
@ Raghunandan Vielen Dank!
Chinmay Dabke

Antworten:

213

Angenommen, Sie haben ein Schubladenlayout in XML definiert:

DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
...
if(mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
  //drawer is open
}
Neoh
quelle
Bedeutet das, dass die Schublade geöffnet ist?
Chinmay Dabke
8
Obwohl es für viele offensichtlich sein mag, möchte ich darauf hinweisen, dass isDrawerOpen (GravityCompat.END) verwendet werden sollte, wenn die Schublade von rechts geöffnet wird (dh android: layout_gravity = "right")
Hong
3
Wenn Sie schließen möchten, sollten Sie diesen Kommentar hinzufügen, wenn 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);

Dieser Hörer benutzt :)

ShakeJ
quelle
Danke, aber ich benutze keine Aktionsleiste mit Navigationsschublade. Ich muss es nur in einer Methode verwenden!
Chinmay Dabke
20

Verwenden:

mDrawerLayout.isDrawerOpen () -Methode

Beispiel:

    if(mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
        mDrawerLayout.closeDrawer(Gravity.LEFT); //CLOSE Nav Drawer!
    }else{
        mDrawerLayout.openDrawer(Gravity.LEFT); //OPEN Nav Drawer!
    }
Jorgesys
quelle
3
Wenn die Schublade geöffnet ist, öffnen Sie die Schublade, andernfalls schließen Sie die Schublade: D
ataulm
5

Auf folgende Weise können Sie feststellen, dass die Schublade geöffnet oder geschlossen ist.

 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
quelle
Verwenden Sie addDrawerListener, da das Set veraltet ist
SeaRoth
3

Die Antwort von ShakeJ ist die richtige, und denken Sie daran, dass Sie die onDrawerSlide verwenden können, um andere Funktionen auszulösen. Ich habe sie beispielsweise zum Ändern der Statusleistenfarbe verwendet.

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

Erkennen Sie DrawerLayoutgeöffnete, geschlossene und verschobene 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) {

    }
});

Überprüfen Sie, ob die Schublade geöffnet ist

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

Die Methode ist die gleiche in Kotlin.

  1. Initialisieren Sie die DrawerLayout- Ansicht

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

  2. Überprüfen Sie, ob die Schublade geöffnet ist

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

Wenn Sie beim Öffnen oder Schließen der Schublade automatisch Maßnahmen ergreifen möchten, haben Sie folgende Möglichkeiten.

  1. Erstellen Sie in Ihrer Hauptaktivität eine innere Klasse, die eine Unterklasse von DrawerLayout.DrawerListener ist . Die DrawerLayout-Klasse implementiert die DrawerListener-Schnittstelle.

    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. Fügen Sie Ihre Aktion in die Funktion ein, die Sie verwenden möchten. In meinem Beispiel schließe ich die Softtastatur, wenn der Benutzer mit der Navigationsleiste interagiert. Deklarieren Sie den InputMethodManager in Ihrer Hauptaktivität folgendermaßen:

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

  3. Fügen Sie Ihren benutzerdefinierten DrawerListener zum drawerLayout hinzu (ich habe ihn in die onCreate-Methode eingefügt).

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

Joe Muller
quelle
1

Möglicherweise bin ich zu spät, kann aber neue aktualisierte Informationen weitergeben. In dem angegebenen Code setze ich das Öffnen / Schließen der Schublade in der On-Click-Funktion. Wenn die Schublade geöffnet ist, wird sie geschlossen, andernfalls wird sie geöffnet. Diese Lösung basiert auf RXava DrawerLayout (androidx.drawerlayout.widget.DrawerLayout). In meinem Code öffne ich das Schubladenlayout von rechts nach links.

 @Override
    public void onClick(View view) {

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

}

Hinweis: Wenn Sie drawerLayout von rechts öffnen, verwenden Sie "GravityCompat.END" und es ist von links geöffnet. Verwenden Sie dann "GravityCompat.START" . Viel Spaß beim Codieren .....

Eifriges System
quelle