탐색 창이 열려 있는지 감지하는 방법은 무엇입니까?


91

제목은 모든 것을 설명합니다. 내가 원하는 것은 탐색 창이 열려 있는지 여부를 아는 것입니다. 나는 인터넷에서 많이 검색하고 방법을 찾았 isDrawerOpen(int drawerGravity)지만 방법에서 사용하는 방법을 설명하는 만족스러운 답변을 찾지 못했습니다. 누군가 나에게 설명해 주시면 감사하겠습니다.

미리 감사드립니다!


3
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList). mDrawerLayout 서랍과 mDrawerList리스트 뷰입니다
Raghunandan

@Raghunandan 감사합니다!
Chinmay Dabke 2014

답변:


215

xml에서 drawerlayout을 정의했다고 가정합니다.

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

서랍이 열려 있다는 뜻입니까?
Chinmay Dabke 2014

8
많은 사람들에게 분명 할 수 있지만 서랍이 오른쪽에서 열리면 isDrawerOpen (GravityCompat.END))을 사용해야한다는 점을 지적하고 싶습니다 (예 : android : layout_gravity = "right")
Hong

3
닫으려면이 코드를 추가해야합니다. if staments drawer.closeDrawer (Gravity.START);
메 흐멧

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 2014

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

set이 더 이상 사용되지 않으므로
addDrawerListener

3

shakeJ의 대답은 올바른 것이며 onDrawerSlide 를 사용하여 다른 기능을 실행할 수 있음 을 기억하십시오. 예를 들어 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

검색 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

1

방법은 Kotlin에서 동일합니다.

  1. DrawerLayout 보기 초기화

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

  2. 서랍이 열려 있는지 확인

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

서랍을 열거 나 닫을 때 자동으로 작업을 수행하려면 다음을 수행하십시오.

  1. 기본 활동에서 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)


1

늦었지만 새로운 업데이트 정보를 공유 할 수 있습니다. 주어진 코드에서 onclick 함수에서 열기 / 닫기 서랍을 설정했습니다. 서랍이 닫히면 열려있는 것보다 열려 있으면이 솔루션은 RXava DrawerLayout을 기반으로 (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"를 사용하는 것보다 왼쪽에서 열립니다 . 코딩 즐기기 .....

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.