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!


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
}

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


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!
    }

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

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");
            }
        }

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

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)


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 .....

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.