총 게시물 1,106건, 최근 0 건 안내 RSS 글쓰기
이전글  다음글  목록 글쓰기
[강좌]

addDrawerListener, setDrawerListener(deprecated)/[Android]

글쓴이 : 김병희라고요 날짜 : 2016-11-02 (수) 05:50 조회 : 3073
글주소 : http://www.androidside.com/B56/32584
 
  No1 기술혁신 NXP반도체
반도체전문업체, 휴대전화, 가전, ID, 범용반도체, 소프트웨어, 반도체제품안내.
www.nxp.com
  APP제작사 바이더앱
어플개발, 안드로이드, 아이폰, 어플맞춤제작, 쇼핑몰앱제작, 무료상담
www.buytheapp.co.kr
  오라클자바교육센터 구로본점
안드로이드전문교육, SDK실무개발, APP개발프로젝트, 실습폰지원, 재직자환급
www.oraclejava.co.kr
신청하기


addDrawerListener, setDrawerListener(deprecated)/[Android]

/ 2016.11.02. 최초 작성


원본 : http://blog.daum.net/andro_java/739


통상적인 상황에 대해서는 대개 체크를 하게 되지만, 극한상황이나 비정상적인 상황에 대한 체크는 생각나면 바로 테스트하고 메모를 남기는 습관을 들이는 것이 좋다.


왕앱따 103. 아이콘 반복클릭 테스트/[Android] http://blog.daum.net/andro_java/737


위 글도 그 하나의 예가 될지 모른다.


1. 문제


<문제> 키보드 열린 상태에서 Drawer(NavigationView) 열면 > 키보드가 닫히지 않고 Drawer가 키보드 아래 깔리는 문제


2. setDrawerListener


위 문제를 해결하기 위해 Drawer 상태를 파악하고 제어할 수 있는 방법을 구글링하다가 setDrawerListener를 만났다.


그런데 조금 살펴보니 deprecated되었다고 한다.


3. addDrawerListener


그 대신 addDrawerListener 메소드를 사용하라는데 ...


Added Methods : void addDrawerListener(DrawerListener) void removeDrawerListener(DrawerListener)

Changed Methods : void setDrawerListener(DrawerListener) Now deprecated.


https://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html#addDrawerListener(android.support.v4.widget.DrawerLayout.DrawerListener)


위 페이지에 들어가 보아도 잘 모르겠고, 구글링해도 마뜩찮다.


4. 삽질


1) 현재 코드


        drawerLeft = (DrawerLayout) findViewById(R.id.drawerLeft);

        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawerLeft, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);

        drawerLeft.setDrawerListener(toggle);

        toggle.syncState();


필자는 Drawer를 양쪽에 달아서 사용하기 때문에 알기 쉽게 이름을 붙인 것이다.


2) 추가 코드


        drawerLeft.addDrawerListener(new DrawerLayout.DrawerListener() {

            @Override

            public void onDrawerSlide(View drawerView, float slideOffset) { }


            public void onDrawerOpened(View drawerView) {

                Util.hideKeyboard(MainActivity.et_search); // 혹시 키보드가 열려 있으면 닫는다.

            }


            @Override

            public void onDrawerClosed(View drawerView) { }


            @Override

            public void onDrawerStateChanged(int newState) { }

        });


이것으로 해결되었다.

onDrawerSlide, onDrawerClosed, onDrawerStateChanged 사용할 일이 없어도 지우면 컴파일이 되지 않는다.


3) onDrawerSlide


Util.uToast(String.format("%.2f", slideOffset));


코드를 삽입하고 돌려보니 열었을 때는 1.00, 닫았을 때는 0.00 보고하는데 별 용도를 모르겠다.


위 코드는 http://mainia.tistory.com/718 페이지를 참고했다.


결국 setDrawerListener를 addDrawerListener로 이름 바꾼 외에 어떤 차이가 있는지는 모르겠다.


5. toggle


        drawerLeft.setDrawerListener(toggle);

        toggle.syncState();


위 둘째 줄을 주석처리하고 돌리면, Drawer를 열고 닫는 토글버튼이 보이지 않는다.

첫 줄은 지워도 무관하다.


6. isDrawerOpen, closeDrawer, openDrawer


리스너 안에서 onDrawerOpened 메소드가 하는 역할과 같은 메소드이다.


        if (drawerLeft.isDrawerOpen(GravityCompat.START)) { drawerLeft.closeDrawer(GravityCompat.START); }

        else {

            if (drawerRight.isDrawerOpen(GravityCompat.END)) { Bible.bibleOnOff(); }


Drawer 아이디(drawerRight)가 드나드는 방향(END)을 파라미터로 주어야 된다.


필자의 drawerRight 뷰는 오른쪽에서 나오는 것이므로 START 대신 END를 준 것이다.


closeDrawer 메소드로 닫고 openDrawer 메소드로 열 수 있는데, 마찬가지로 옵션에 주는 방향 속성을 정확하게 맞추어야 된다.


7. Util.drawerLeftListener


필자는 가능하면 MainActivity.java 파일에서 코드를 분리하여 다른 클래스파일로 분산한다.


        drawerLeft.addDrawerListener(Util.drawerLeftListener);


위와 같이 바꾸고, Util 클래스로 모든 코드를 옮겨놓았다.


    static DrawerLayout.DrawerListener drawerLeftListener = new DrawerLayout.DrawerListener() {

        ...

    };


8. drawerRightListener


        drawerRight = (DrawerLayout)findViewById(R.id.drawerRight);

        drawerRight.addDrawerListener(Util.drawerRightListener);


앞에서 만든 drawerLeftListener 통째 베껴서 이름만 바꾸어주면 되겠다.


    static DrawerLayout.DrawerListener drawerRightListener = new DrawerLayout.DrawerListener() {

        @Override

        public void onDrawerSlide(View drawerView, float slideOffset) { } // Util.uToast(String.format("%.2f", slideOffset));


        public void onDrawerOpened(View drawerView) {

            MainActivity.bibleMenu.setIcon(R.drawable.ic_bible_off);

            Util.hideKeyboard(MainActivity.et_search); // 혹시 키보드가 열려 있으면 닫는다.

        }


        @Override

        public void onDrawerClosed(View drawerView) {

            MainActivity.bibleMenu.setIcon(R.drawable.ic_bible_on);

        }


        @Override

        public void onDrawerStateChanged(int newState) { }

    };


다만, drawerLeftListener와는 다리 메뉴 아이콘 변경하는 일을 추가로 시키고 있다.


1) bibleOnOff


양쪽 Drawer 사용은 가능해서 구현했는데, 오른쪽에도 toggle 달기는 시도하다가 실패했다.


그래서 액션바의 옵션메뉴 맨 오른쪽 아이콘을 토글버튼 대용으로 쓰고 bibleOnOff 이벤트 핸들러를 달았다.


이제 위 메소드에서 처리했던 키보드 닫기, 아이콘 변경 코드를 모두 지워도 된다.


    // 성경선택 드로어 열기/닫기

    static void bibleOnOff() {

        if (MainActivity.drawerRight.isDrawerOpen(GravityCompat.END)) {

            // MainActivity.bibleMenu.setIcon(R.drawable.ic_bible_off);

            MainActivity.drawerRight.closeDrawer(GravityCompat.END);

        }

        else {

            if (MainActivity.drawerLeft.isDrawerOpen(GravityCompat.START)) { MainActivity.drawerLeft.closeDrawer(GravityCompat.START); }

            // MainActivity.bibleMenu.setIcon(R.drawable.ic_bible_on);

            MainActivity.drawerRight.openDrawer(GravityCompat.END);

            // Util.hideKeyboard(MainActivity.et_search); // 혹시 열려 있으면 닫는다.

        }

    }


주석처리한 3줄이 그것이다.


이제 bibleOnOff 메소드에서 Drawer 열고 닫는 일만 하면 drawerRightListener 메소드가 나머지는 처리하는 것이다.


2) drawerLeft.closeDrawer


            if (MainActivity.drawerLeft.isDrawerOpen(GravityCompat.START)) { MainActivity.drawerLeft.closeDrawer(GravityCompat.START); }


이 줄은 양쪽 Drawer가 다 열리면 drawerLeft가 위로 덮여서 drawerRight가 보이지 않기 때문에 추가한 코딩이다.


3) toggle 양쪽 달기


        drawerRight = (DrawerLayout)findViewById(R.id.drawerRight);

        ActionBarDrawerToggle toggle2 = new ActionBarDrawerToggle(this, drawerRight, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);

        toggle2.syncState();

        drawerRight.addDrawerListener(Util.drawerRightListener);


다시 위와 같이 시도해 보아도, 토글 버튼은 왼쪽에만 보이고, 그것을 클릭하면 앱이 죽어버린다.


java.lang.IllegalArgumentException: No drawer view found with gravity LEFT


4) 앱 기능 개선


bibleOnOff 메소드만 사용할 때는 스와이프(드래그) 방식으로 열고 닫으면 아이콘 모양이 바뀌지 않았다.


이제 리스너가 잘 듣고 아이콘 모양도 바꾸어준다.


9. 양쪽 Drawer 사용 방법


DoubleDrawer(5) - 좌우 모두 NavigationView 사용/[Android]

http://blog.daum.net/andro_java/723


위 글과 그 앞 글들(목록보기) 참고하면 된다.





추천 버튼을 클릭하면 추천한 자와 추천받은 자 모두에게 포인트가 지급됩니다.

이전글  다음글  목록 글쓰기

총 게시물 1,106건, 최근 0 건 안내 RSS
번호 분류 제목 글쓴이 날짜 추천 조회
1106 TIP&TECH  안드로이드 이미지뷰 이동 질문드립니다. 구리시인 06-27 0 127
1105 소스코드  안드로이드 스튜디오 (oreo) 설문조사 어플 개… sooooom 06-16 0 195
1104 강좌  100 Days Google Dev, 3: Google Play Services 7.5 StanleyKou 01-24 0 715
1103 강좌  100 Days Google Dev, 2: The Magic of LRU Cache StanleyKou 01-20 0 723
1102 강좌  100 Days Google Dev, 1: Android Design Support Library 2 StanleyKou 01-18 0 830
1101 TIP&TECH  리스트뷰에서 스위치,체크박스사용시 5 에찌 05-08 5 2241
1100 TIP&TECH  뷰(RecyclerView/...)에 Max Height 주기/[Android] 김병희라고요 04-26 0 1979
1099 TIP&TECH  TabLayout ClickEvent 에찌 04-21 1 1767
1098 TIP&TECH  현재 사용하고 있는 어플 foreground인지 backgroun… 4 에찌 04-14 2 2677
1097 TIP&TECH  안드로이드 Drawble 에 해상도 마다 이미지를 … 1 에찌 04-14 1 1813
1096 TIP&TECH  fragment 에서 ButterKnife 사용 시 resource가져올 때… 1 에찌 04-12 0 1466
1095 TIP&TECH  Youtube 및 facebook 동영상 업로드 할때 1 희망과꿈을 03-28 0 1921
1094 TIP&TECH  google service lib 가져올 때 3 에찌 03-20 3 1916
1093 소스코드  CentralRV 프로젝트 - RecyclerView 가로/세로 가운… 1 김병희라고요 01-30 2 3341
1092 TIP&TECH  번개검색 시스템/[Android] 2 김병희라고요 12-29 2 2462
1091 TIP&TECH  RecyclerView 특정 포지션으로 스크롤 - smoothScroll… 1 김병희라고요 12-12 1 2404
1090 강좌  왕앱따 107. 자바/C++ 파일읽기 속도 비교/[Androi 김병희라고요 11-26 0 2532
1089 강좌  왕앱따 106. C++ 동영상 강좌/[Android] 김병희라고요 11-23 0 2959
1088 소스코드  AOSP용 한글 키보드 입력키 엘카이저 11-17 1 2724
1087 강좌  addDrawerListener, setDrawerListener(deprecated)/[Android] 김병희라고요 11-02 2 3074
 1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  다음  맨끝
 


Copyright ⓒ www.androidside.com. All rights reserved.
채팅 권한: 글쓰기 1개
2레벨 이상만 대화 가능
공개 채팅: 평일 !(9시 ~ 17시),토,일
안사2 변경사항 보러가기 챗방이 잘 안보이면 크롬에서 접속해주세요
챗방 숨기기 |  챗방 보이기