จะตรวจสอบได้อย่างไรว่าลิ้นชักการนำทางเปิดอยู่หรือไม่?


90

ชื่อเรื่องอธิบายทั้งหมด สิ่งที่ฉันต้องการทำคือรู้ว่าลิ้นชักการนำทางเปิดอยู่หรือไม่ ฉันค้นหาข้อมูลมากมายบนอินเทอร์เน็ตและพบวิธีการนี้isDrawerOpen(int drawerGravity)แต่ไม่พบคำตอบที่น่าพอใจซึ่งอธิบายถึงวิธีใช้ในวิธีการ ฉันจะขอบคุณถ้าใครอธิบายให้ฉันฟัง

ขอบคุณล่วงหน้า!


3
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList). mDrawerLayout คือลิ้นชักและ mDrawerList คือ listview
Raghunandan

@Raghunandan ขอบคุณมาก!
Chinmay Dabke

คำตอบ:


215

สมมติว่าคุณได้กำหนด Drawlayout ใน xml:

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

หมายความว่าลิ้นชักเปิดอยู่หรือไม่?
Chinmay Dabke

8
แม้ว่าหลายคนอาจเห็นได้ชัด แต่ฉันอยากจะชี้ให้เห็นว่าควรใช้ isDrawerOpen (GravityCompat.END)) หากลิ้นชักเปิดจากด้านขวา (เช่น android: layout_gravity = "right")
Hong

3
หากคุณต้องการปิดคุณควรเพิ่ม coment นี้ใน if staments drawer.closeDrawer (Gravity.START);
mehmet

33
 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);

ที่ผู้ฟังใช้ :)


ขอบคุณ แต่ฉันไม่ได้ใช้แถบการทำงานกับลิ้นชักการนำทาง ก็ต้องใช้ให้ถูกวิธี!
Chinmay Dabke

20

ใช้:

mDrawerLayout.isDrawerOpen ()วิธีการ

ตัวอย่าง:

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

3
ถ้าลิ้นชักเปิดเปิดลิ้นชักปิดลิ้นชักอื่น: D
ataulm

5

ด้วยวิธีต่อไปนี้คุณจะพบว่าลิ้นชักเปิดหรือปิดอยู่ ..

 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

ใช้ addDrawerListener เนื่องจากชุดเลิกใช้แล้ว
SeaRoth

3

ตรวจจับDrawerLayoutเปิดปิดสไลด์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) {

    }
});

ตรวจสอบลิ้นชักเปิดอยู่

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

2

คำตอบของ shakeJ เป็นคำตอบที่ถูกต้องและจำไว้ว่าคุณสามารถใช้onDrawerSlideเพื่อให้สามารถใช้งานฟังก์ชั่นอื่น ๆ ได้ ... ตัวอย่างเช่นฉันใช้มันเพื่อเปลี่ยน StatusBar Color

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

2

ฉันอาจจะมาช้า แต่ฉันสามารถแบ่งปันข้อมูลที่อัปเดตใหม่ได้ ในรหัสให้ผมตั้งเปิด / ปิดลิ้นชักใน onclick function.If ลิ้นชัก isopen กว่ามัน willbe ปิดการแก้ปัญหาอื่น open.This จะขึ้นอยู่กับ RXava (androidx.drawerlayout.widget.DrawerLayout)DrawerLayout ในรหัสของฉันฉันเปิดลิ้นชักเลย์เอาต์จากขวาไปซ้าย

 @Override
    public void onClick(View view) {

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

}

หมายเหตุ: หากคุณเปิด drawerLayout จากการใช้งานทางด้านขวา"GravityCompat.END"และจะเปิดให้บริการตั้งแต่ด้านซ้าย, กว่าการใช้"GravityCompat.START" สนุกกับการเขียนโค้ด .....


1

วิธีการนี้เหมือนกันใน Kotlin

  1. เริ่มต้นDrawerLayout View

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

  2. ตรวจสอบว่าลิ้นชักเปิดอยู่หรือไม่

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

หากคุณต้องการดำเนินการโดยอัตโนมัติเมื่อเปิดหรือปิดลิ้นชักคุณสามารถดำเนินการดังต่อไปนี้

  1. ในกิจกรรมหลักของคุณสร้างระดับชั้นที่เป็น subclass ของDrawerLayout.DrawerListener คลาส DrawerLayout ใช้อินเทอร์เฟซ 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. ใส่การกระทำของคุณในฟังก์ชันที่คุณต้องการใช้ ในตัวอย่างของฉันฉันกำลังปิดแป้นพิมพ์อ่อนหากผู้ใช้โต้ตอบกับลิ้นชักการนำทาง ประกาศ InputMethodManager เช่นนี้ในกิจกรรมหลักของคุณ:

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

  3. เพิ่ม DrawerListener ที่คุณกำหนดเองลงใน drawerLayout (ฉันใส่ไว้ในเมธอด onCreate)

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.