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

addDrawerListener, setDrawerListener(deprecated)/[Android]

글쓴이 : 김병희라고요 날짜 : 2016-11-02 (수) 05:50 조회 : 1833
글주소 : http://www.androidside.com/B56/32584
 
  No1 기술혁신 NXP반도체
반도체전문업체, 휴대전화, 가전, ID, 범용반도체, 소프트웨어, 반도체제품안내.
www.nxp.com
  엠브이테크
임베디드 개발용역 및 양산 Rockchip Freescale 엑시노스
www.mvtech.or.kr
  APP제작사 바이더앱
어플개발, 안드로이드, 아이폰, 어플맞춤제작, 쇼핑몰앱제작, 무료상담
www.buytheapp.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,105건, 최근 0 건 안내 RSS
번호 분류 제목 글쓴이 날짜 추천 조회
1105 소스코드  FCM 과 노티 관련 질문드립니다. 2 뜬구름 11-06 0 188
1104 강좌  [국비지원강좌] 안드로이드 기반 스마트콘텐… 오호라그래 10-18 0 214
1103 강좌  [무료] 앱만들기 마스터 강의 20강 전체 무료 씨드래곤아트 09-29 0 473
1102 TIP&TECH  리스트뷰에서 스위치,체크박스사용시 4 에찌 05-08 0 971
1101 TIP&TECH  뷰(RecyclerView/...)에 Max Height 주기/[Android] 김병희라고요 04-26 0 724
1100 TIP&TECH  TabLayout ClickEvent 에찌 04-21 0 717
1099 TIP&TECH  현재 사용하고 있는 어플 foreground인지 backgroun… 4 에찌 04-14 1 1203
1098 TIP&TECH  안드로이드 Drawble 에 해상도 마다 이미지를 … 1 에찌 04-14 0 826
1097 TIP&TECH  fragment 에서 ButterKnife 사용 시 resource가져올 때… 1 에찌 04-12 0 646
1096 TIP&TECH  Youtube 및 facebook 동영상 업로드 할때 1 희망과꿈을 03-28 0 851
1095 TIP&TECH  google service lib 가져올 때 3 에찌 03-20 2 974
1094 소스코드  CentralRV 프로젝트 - RecyclerView 가로/세로 가운… 1 김병희라고요 01-30 1 1721
1093 TIP&TECH  번개검색 시스템/[Android] 2 김병희라고요 12-29 2 1351
1092 TIP&TECH  RecyclerView 특정 포지션으로 스크롤 - smoothScroll… 1 김병희라고요 12-12 1 1368
1091 강좌  왕앱따 107. 자바/C++ 파일읽기 속도 비교/[Androi 김병희라고요 11-26 0 1520
1090 강좌  왕앱따 106. C++ 동영상 강좌/[Android] 김병희라고요 11-23 0 1641
1089 자료  박근혜를 탄핵할 수 있는 어플을 만들었어요. 3 씨드래곤아트 11-23 0 1957
1088 소스코드  AOSP용 한글 키보드 입력키 엘카이저 11-17 1 1459
1087 강좌  addDrawerListener, setDrawerListener(deprecated)/[Android] 김병희라고요 11-02 2 1834
1086 강좌  왕앱따 103. 아이콘 반복클릭 테스트/[Android] 김병희라고요 11-01 0 1440
 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 변경사항 보러가기 챗방이 잘 안보이면 크롬에서 접속해주세요
챗방 숨기기 |  챗방 보이기