Bagaimana cara mendeteksi jika laci navigasi terbuka?

91

Judul menjelaskan semuanya. Semua yang ingin saya lakukan adalah mengetahui apakah panel samping navigasi terbuka atau tidak. Saya banyak mencari di internet dan menemukan metode tersebut isDrawerOpen(int drawerGravity)tetapi tidak dapat menemukan jawaban yang memuaskan yang menjelaskan cara menggunakannya dalam suatu metode. Saya akan sangat menghargai jika ada yang menjelaskan kepada saya.

Terima kasih sebelumnya!

Chinmay Dabke
sumber
3
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList). mDrawerLayout adalah laci dan mDrawerList adalah tampilan daftar
Raghunandan
@Raghunandan Terima kasih banyak!
Chinmay Dabke

Jawaban:

215

Dengan asumsi Anda telah menentukan drawerlayout di xml:

DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
...
if(mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
  //drawer is open
}
Neoh
sumber
Apakah ini berarti laci terbuka?
Chinmay Dabke
8
Meskipun mungkin terlihat jelas bagi banyak orang, saya ingin menunjukkan bahwa isDrawerOpen (GravityCompat.END)) harus digunakan jika laci dibuka dari kanan (yaitu android: layout_gravity = "right")
Hong
3
Jika Anda ingin menutup Anda harus menambahkan komentar ini di if staments drawer.closeDrawer (Gravity.START);
mehmet
34
 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);

Pendengar itu menggunakan :)

Kocok
sumber
Terima kasih, tetapi saya tidak menggunakan bilah tindakan dengan panel samping navigasi. Hanya perlu menggunakannya dalam suatu metode!
Chinmay Dabke
20

Menggunakan:

mDrawerLayout.isDrawerOpen () metode

Contoh:

    if(mDrawerLayout.isDrawerOpen(GravityCompat.START)) {
        mDrawerLayout.closeDrawer(Gravity.LEFT); //CLOSE Nav Drawer!
    }else{
        mDrawerLayout.openDrawer(Gravity.LEFT); //OPEN Nav Drawer!
    }
Jorgesys
sumber
3
jika laci terbuka, buka laci, jika tidak tutup laci: D
ataulm
5

Dengan cara berikut Anda dapat menemukan Laci terbuka atau tertutup ..

 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
sumber
Gunakan addDrawerListener karena set tidak digunakan lagi
SeaRoth
3

jawaban shakeJ itu benar, dan ingat Anda dapat menggunakan onDrawerSlide untuk dapat mengaktifkan fungsi lain ... misalnya saya menggunakannya untuk mengubah Warna 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
sumber
3

Mendeteksi DrawerLayoutdibuka, ditutup, 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) {

    }
});

Periksa Laci dibuka

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

Metodenya sama di Kotlin.

  1. Inisialisasi Tampilan DrawerLayout

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

  2. Periksa apakah laci terbuka

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

Jika Anda ingin mengambil tindakan secara otomatis saat laci dibuka atau ditutup, Anda dapat melakukan hal berikut.

  1. Dalam aktivitas utama Anda, buat kelas dalam yang merupakan subkelas dari DrawerLayout.DrawerListener . Kelas DrawerLayout mengimplementasikan antarmuka 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. Letakkan tindakan Anda dalam fungsi yang ingin Anda gunakan. Dalam contoh saya, saya menutup soft keyboard jika pengguna berinteraksi dengan panel navigasi. Deklarasikan InputMethodManager seperti ini di aktivitas utama Anda:

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

  3. Tambahkan DrawerListener kustom Anda ke drawerLayout (saya taruh di metode onCreate)

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

Joe Muller
sumber
1

Mungkin, saya terlambat tetapi saya dapat membagikan informasi terbaru yang diperbarui. Dalam kode yang diberikan, saya mengatur buka / tutup laci dalam fungsi onclick. Jika laci terbuka maka akan ditutup jika tidak terbuka. Solusi ini didasarkan pada RXava DrawerLayout (androidx.drawerlayout.widget.DrawerLayout). Dalam kode saya, saya membuka drawerlayout dari kanan ke kiri.

 @Override
    public void onClick(View view) {

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

}

Catatan: Jika Anda membuka drawerLayout dari sisi kanan, gunakan "GravityCompat.END" dan buka dari sisi kiri, lalu gunakan "GravityCompat.START" . Nikmati codding .....

Sistem Cemburu
sumber