Làm thế nào để phát hiện nếu ngăn điều hướng đang mở?


89

Tiêu đề nói lên tất cả. Tất cả những gì tôi muốn làm là biết ngăn điều hướng có đang mở hay không. Tôi đã tìm kiếm rất nhiều trên mạng và tìm thấy phương pháp isDrawerOpen(int drawerGravity)nhưng không thể tìm thấy câu trả lời thỏa đáng giải thích cách sử dụng nó trong một phương pháp. Tôi sẽ đánh giá cao nếu ai đó giải thích cho tôi.

Cảm ơn trước!


3
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList). mDrawerLayout là ngăn kéo và mDrawerList là listview
Raghunandan

@Raghunandan Cảm ơn rất nhiều!
Chinmay Dabke

Câu trả lời:


213

Giả sử bạn đã xác định một ngăn kéo trong xml:

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

Điều này có nghĩa là ngăn kéo đang mở?
Chinmay Dabke

8
Mặc dù có thể rõ ràng với nhiều người, nhưng tôi muốn chỉ ra rằng isDrawerOpen (GravityCompat.END)) nên được sử dụng nếu ngăn kéo được mở từ bên phải (tức là android: layout_gravity = "right")
Hồng

3
Nếu bạn muốn đóng, bạn nên thêm mã này vào if staments ngăn kéo.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);

Người nghe đó sử dụng :)


Cảm ơn nhưng tôi không sử dụng thanh tác vụ với ngăn điều hướng. Chỉ cần sử dụng nó trong một phương pháp!
Chinmay Dabke

20

Sử dụng:

mDrawerLayout.isDrawerOpen ()phương thức

Thí dụ:

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

3
nếu ngăn kéo đang mở, mở ngăn kéo, nếu không chặt chẽ ngăn kéo: D
ataulm

5

Bằng cách sau, bạn có thể thấy Ngăn kéo đang mở hoặc đóng ..

 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

Sử dụng addDrawerListener vì bộ không được dùng nữa
SeaRoth

3

Câu trả lời của lắcJ là câu trả lời đúng, và hãy nhớ rằng bạn có thể sử dụng onDrawerSlide để có thể kích hoạt các chức năng khác ... ví dụ như tôi đã sử dụng nó để thay đổi Màu thanh trạng thái.

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

Phát hiện DrawerLayoutmở, đóng, trượt 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) {

    }
});

Kiểm tra ngăn kéo được mở

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

1

Phương pháp này cũng giống như trong Kotlin.

  1. Khởi tạo Chế độ xem DrawerLayout

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

  2. Kiểm tra xem ngăn kéo có mở không

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

Nếu bạn muốn thực hiện các hành động tự động khi ngăn kéo được mở hoặc đóng, bạn có thể làm như sau.

  1. Trong hoạt động chính của bạn, hãy tạo một lớp bên trong là lớp con của DrawerLayout.DrawerListener . Lớp DrawerLayout thực hiện giao diện 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. Đặt hành động của bạn vào chức năng bạn muốn sử dụng. Trong ví dụ của tôi, tôi đang đóng bàn phím mềm nếu người dùng tương tác với ngăn điều hướng. Khai báo InputMethodManager như thế này trong hoạt động chính của bạn:

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

  3. Thêm DrawerListener tùy chỉnh của bạn vào ngăn kéoLayout (tôi đặt nó trong phương thức onCreate)

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


1

Có thể là, tôi đến muộn nhưng tôi có thể chia sẻ thông tin cập nhật mới. Trong mã đã cho, tôi đặt mở / đóng ngăn kéo trong chức năng onclick, nếu ngăn kéo mở nhiều hơn nó sẽ được đóng nếu không sẽ mở. Giải pháp này dựa trên RXava DrawerLayout (androidx.drawerlayout.widget.DrawerLayout). Trong mã của tôi, tôi mở ngăn kéo từ phải sang trái.

 @Override
    public void onClick(View view) {

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

}

Lưu ý: Nếu bạn mở ngăn kéoLayout từ phía bên phải, hãy sử dụng "GravityCompat.END" và nó mở từ phía bên trái, thay vì sử dụng "GravityCompat.START" . Thưởng thức mã hóa .....

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.