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

addDrawerListener, setDrawerListener(deprecated)/[Android]

글쓴이 : 김병희라고요 날짜 : 2016-11-02 (수) 05:50 조회 : 1307
글주소 : http://www.androidside.com/B56/32584
 
  엠브이테크
임베디드 개발용역 및 양산 Rockchip Freescale 엑시노스
www.mvtech.or.kr
  SBS아카데미컴퓨터학원송강인
여름방학 최대 40% 할인이벤트, 1:1멘토링 시스템, 강남역 연결 편리한위치
sbs-artcom.co.kr
  SBS아카데미컴퓨터학원한석현
여름방학 최대 40% 할인이벤트, 1:1멘토링 시스템, 강남역 연결 편리한위치
sbsartcenter.net
신청하기


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,111건, 최근 0 건 안내 RSS
번호 분류 제목 글쓴이 날짜 추천 조회
1111 강좌  코딩없이 유기동물조회 앱만들기_공공OpenAPI … 씨드래곤아트 06-22 0 227
1110 TIP&TECH  꿀팁_공공OpenAPI 쉽게 적용하기_지하철조회앱… 씨드래곤아트 06-19 0 269
1109 TIP&TECH  코딩 힘들때 참고하세요. 대기업부터 공모전… 1 씨드래곤아트 06-16 0 375
1108 TIP&TECH  CalendarView에서요 3 마소지 05-24 0 393
1107 TIP&TECH  리스트뷰에서 스위치,체크박스사용시 4 에찌 05-08 0 555
1106 자료  videoview에서 동영상 실행할때 검은화면 1 소트 05-02 0 341
1105 TIP&TECH  뷰(RecyclerView/...)에 Max Height 주기/[Android] 김병희라고요 04-26 0 324
1104 TIP&TECH  TabLayout ClickEvent 에찌 04-21 0 321
1103 TIP&TECH  현재 사용하고 있는 어플 foreground인지 backgroun… 3 에찌 04-14 0 665
1102 TIP&TECH  안드로이드 Drawble 에 해상도 마다 이미지를 … 1 에찌 04-14 0 403
1101 TIP&TECH  fragment 에서 ButterKnife 사용 시 resource가져올 때… 1 에찌 04-12 0 363
1100 강좌  감사합니다 1 백두산ee 03-28 0 391
1099 TIP&TECH  Youtube 및 facebook 동영상 업로드 할때 1 희망과꿈을 03-28 0 423
1098 TIP&TECH  google service lib 가져올 때 3 에찌 03-20 2 625
1097 강좌  java언어에서요 4 andhuni 02-20 0 959
1096 TIP&TECH  개발 환경에 대한 질문 한 개 올립니다 6 스머리 02-03 3 1206
1095 강좌  어플 게임아이콘 1 앙기모띠 02-01 2 751
1094 소스코드  CentralRV 프로젝트 - RecyclerView 가로/세로 가운… 1 김병희라고요 01-30 1 900
1093 TIP&TECH  번개검색 시스템/[Android] 2 김병희라고요 12-29 2 967
1092 TIP&TECH  RecyclerView 특정 포지션으로 스크롤 - smoothScroll… 1 김병희라고요 12-12 1 828
 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 변경사항 보러가기 챗방이 잘 안보이면 크롬에서 접속해주세요
챗방 숨기기 |  챗방 보이기