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

DoubleDrawer(3) - 페이지 관리, openPage/[Android]

글쓴이 : 김병희라고요 날짜 : 2016-10-27 (목) 00:22 조회 : 1589
글주소 : http://www.androidside.com/B56/32560
 
  G마켓 PSTYLE
쇼핑을 바꾸는 쇼핑! G마켓 스마일클럽 15%+15%, 콘서트 티켓 증정! G마켓
www.gmarket.co.kr
  PSTYLE, 옥션
가정의달 PSTYLE! 12%+15%+15%쿠폰증정+카드사 할인까지! 어서옥션!
www.auction.co.kr
  11번가 PSTYLE
카드사별 최대15%할인, 무이자12개월, OK캐쉬백 적립! PSTYLE.
www.11st.co.kr
신청하기


DoubleDrawer(3) - 페이지 관리, openPage/[Android]

/ 2016.10.27. 최초 작성


글이 긴데 나누어 올리기도 애매해서, 전체 글을 보시려면 아래 원본 페이지를 보시기 바랍니다.

미안합니다.


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


DoubleDrawer(2) - Navigation 메뉴, Option 메뉴/[Android]

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


위 글에서 이어진다.


전체 소스 : https://github.com/k8z7/DoubleDrawer/commits/master


1. one Activity - Multi Layout


앞 글에서 2개의 서랍(Drawer)을 동시에 끌어내면 하나가 다른 서랍 밑에 깔리는 문제를 언급하였다.


그 외에도 탭호스트 등의 구조체를 사용하지 않고 하나의 Activity로 둘 이상의 Layout을 관리하려면 충돌 문제를 고려해야 된다.


2. Layout


지금 액션바에 고정된 Option 메뉴 및 Navigation 메뉴 외에 ContentsView는 슬라이더 하나 뿐이다.


액션바 4개 아이콘으로 링크되는 4개의 메뉴 중 1개는 음성출력 용도이며, 나머지 2개는 각 페이지(ContentsView)를 열어줄 메뉴이다.


1) Option 메뉴 페이지


왼쪽은 파일명, 오른쪽은 그 페이지 루트뷰의 아이디이다.


search_page.xml : inc_explorer


explorer_page.xml : inc_search


2) Navigation 메뉴 페이지


그 외에 Navigation 메뉴 중에도 페이지를 여는 메뉴가 있다.


help_page.xml : inc_help


bmfh_page.xml : inc_bmfh


setting_page.xml : inc_setting


3) 메인 페이지


main_page.xml : inc_main


이것은 어떤 페이지를 열지 않아도 앱이 시작되면 나타날 페이지로 한다.


4) visibility 속성


메인 페이지만 두고, 나머지 모든 페이지는 gone 지정한다.


    android:visibility="gone">


5) 임시 TextView


임시로 TextView 하나를 match_parent 크기로 만들고 background 및 text로 구분이 되게 만든다.


메인 페이지는 background 속성을 주지 않는다.


6) 샘플 페이지


search_page.xml 파일 하나만 참고로 소스를 보인다.


<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical" android:layout_width="match_parent"

    android:layout_height="match_parent"

    android:id="@+id/inc_search"

    android:visibility="gone">


    <TextView

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:textSize="24sp"

        android:textStyle="bold"

        android:background="#33ff0000"

        android:text="성경검색 페이지"

         />


</LinearLayout>


3. include


activity_main.xml 파일에서 두 번째 DrawerLayout 안에 처음 나오는 TextView가 있다.


                <TextView

                    android:layout_width="match_parent"

                    android:layout_height="match_parent"

                    android:text="Hello World!"

                    android:gravity="center" />


위 자리를 다음 코드로 대체한다.


                <LinearLayout

                    android:orientation="vertical"

                    android:background="#ffffee"

                    android:layout_width="match_parent"

                    android:layout_height="match_parent">


                    <include layout="@layout/help_page" />

                    <include layout="@layout/search_page" />

                    <include layout="@layout/bmfh_page" />

                    <include layout="@layout/explorer_page" />

                    <include layout="@layout/setting_page" />

                    <include layout="@layout/main_page" />


                </LinearLayout>


인클루드된 6개 페이지 중 main_page 외에는 모두 android:visibility="gone" 상태이다.


4. 페이지 변수 선언 및 초기화


각 페이지의 루트뷰에 아이디를 주었다.

모든 페이지 다루는 코딩이 모두 MainActivity.java 파일에서만 이루어질 수 없으므로, static 변수로 선언하고 초기화한다.


1) 멤버변수


    static LinearLayout inc_main, inc_explorer, inc_bmfh, inc_setting, inc_search, inc_help;

    static View[] views = null; // inc_main 외의 모든 루트뷰 배열


2) initView 메소드


하나의 앱을 초기화하는 데는 수많은 코드가 필요한데, 모두 onCreate 안에 담는 것은 보기도 좋지 않고 앱을 무겁게 만들 우려가 농후하다.


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        ...

        initView();

    }


    // View 가져오기

    private void initView() {

        inc_main = (LinearLayout) findViewById(R.id.inc_main);

        inc_explorer = (LinearLayout) findViewById(R.id.inc_explorer);

        inc_bmfh = (LinearLayout) findViewById(R.id.inc_bmfh);

        inc_setting = (LinearLayout) findViewById(R.id.inc_setting);

        inc_search = (LinearLayout) findViewById(R.id.inc_search);

        inc_help = (LinearLayout) findViewById(R.id.inc_help);


        views = new View[]{inc_explorer, inc_bmfh, inc_setting, inc_search, inc_help};

    }


5. ActionBarDrawerToggle


이 항목은 불필요하여 코딩 후에 취소하고 원상복귀하지만, 다른 용도에는 참고가 될가 하여 남겨둔다.


여러 페이지 컨트롤을 위해 왼쪽 서랍(navigation_drawer)이 열렸는지 닫혔는지 확인할 필요가 있다.


참고 : https://www.alphafactory.co.kr/post/2016/04/22/creating-a-navigation-drawer/


1) 멤버변수


    boolean drawerOpened = false;


2) ActionBarDrawerToggle 코드 수정


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

=>

        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) {

           

            public void onDrawerClosed(View view) {

                super.onDrawerClosed(view);

                drawerOpened = false;

                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()

            }


           

            public void onDrawerOpened(View drawerView) {

                super.onDrawerOpened(drawerView);

                drawerOpened = true;

                invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()

            }

        };


샘플 프로젝트에 자동으로 코딩되어 있던 끝에, 참고 페이지를 베껴서 {} 안에 ActionBarDrawerTaggle 클래스의 인스턴스에 있는 DrawerLayout.DrawerListener 콜백 함수들을 오버라이드하였다.

다만, 참고 페이지는 액션바의 내용을 수정했지만 우리는 drawerOpened 변수를 토글하고 있는 점이 다르다.


3) 불필요한 코드, 작업 취소


지난 글에서 onBackPressed 메소드에 코딩한 내용, 그 중에서도 샘플 소스로 애초에 있던 코드에 isDrawerOpen 메소드로 드로어가 열려 있는지 여부의 판단은 된다.


그러므로 이 항목에서 만든 멤버변수르 지우고, ActionBarDrawerToggle 초기화도 원상복구한다.


6. BackPress(백키) 처리


다른 페이지가 열린 상태에서 백키를 눌러 메인 페이지로 돌아가려는데 앱이 끝나버리면 곤란하다.


왼쪽 서랍은 앞에서 보았고, 오른쪽 서랍(ContentsView)도 openLayer/closeLayer로 열고 닫을 때 Visibility 속성값을 주므로 우리가 쉽게 상태를 파악할 수 있다.


이제 열고 닫을 모든 뷰의 상태를 알 수 있으므로, 순서를 잘 잡아서 백키 처리를 해주면 된다.


빈 줄에서 [알트+Ins] 해서 오버라이드 메소드를 선택하여 만들면 된다.

이 때 리스트에서 아무리 검색해도 onBackPressed를 찾을 수 없는 경우를 당해서 당황하는 수가 있는데, 이미 작성되어 있기 때문이다.


onBackPressed 메소드를 찾아서 다음과 같이 수정한다.


    // BackPress(백키) 처리

    @Override

    public void onBackPressed() {

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);

        if (drawer.isDrawerOpen(GravityCompat.START)) {

            drawer.closeDrawer(GravityCompat.START);

        } else {

            if (slider.getVisibility() == View.VISIBLE) { closeLayer(); }

            else {

                View opened = null;

                for(View page:views) {

                    if(page.g





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

이전글  다음글  목록 글쓰기

총 게시물 1,104건, 최근 0 건 안내 RSS
번호 분류 제목 글쓴이 날짜 추천 조회
1104 강좌  100 Days Google Dev, 3: Google Play Services 7.5 StanleyKou 01-24 0 431
1103 강좌  100 Days Google Dev, 2: The Magic of LRU Cache StanleyKou 01-20 0 486
1102 강좌  100 Days Google Dev, 1: Android Design Support Library 2 StanleyKou 01-18 0 555
1101 TIP&TECH  리스트뷰에서 스위치,체크박스사용시 4 에찌 05-08 3 1824
1100 TIP&TECH  뷰(RecyclerView/...)에 Max Height 주기/[Android] 김병희라고요 04-26 0 1565
1099 TIP&TECH  TabLayout ClickEvent 에찌 04-21 0 1419
1098 TIP&TECH  현재 사용하고 있는 어플 foreground인지 backgroun… 4 에찌 04-14 1 2142
1097 TIP&TECH  안드로이드 Drawble 에 해상도 마다 이미지를 … 1 에찌 04-14 0 1516
1096 TIP&TECH  fragment 에서 ButterKnife 사용 시 resource가져올 때… 1 에찌 04-12 0 1195
1095 TIP&TECH  Youtube 및 facebook 동영상 업로드 할때 1 희망과꿈을 03-28 0 1539
1094 TIP&TECH  google service lib 가져올 때 3 에찌 03-20 3 1636
1093 소스코드  CentralRV 프로젝트 - RecyclerView 가로/세로 가운… 1 김병희라고요 01-30 1 2857
1092 TIP&TECH  번개검색 시스템/[Android] 2 김병희라고요 12-29 2 2188
1091 TIP&TECH  RecyclerView 특정 포지션으로 스크롤 - smoothScroll… 1 김병희라고요 12-12 1 2053
1090 강좌  왕앱따 107. 자바/C++ 파일읽기 속도 비교/[Androi 김병희라고요 11-26 0 2205
1089 강좌  왕앱따 106. C++ 동영상 강좌/[Android] 김병희라고요 11-23 0 2570
1088 소스코드  AOSP용 한글 키보드 입력키 엘카이저 11-17 1 2332
1087 강좌  addDrawerListener, setDrawerListener(deprecated)/[Android] 김병희라고요 11-02 2 2682
1086 강좌  왕앱따 103. 아이콘 반복클릭 테스트/[Android] 김병희라고요 11-01 0 2030
1085 강좌  왕앱따 100. 안드로이드 왕초보의 앱개발 따라… 김병희라고요 10-29 0 2461
 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 변경사항 보러가기 챗방이 잘 안보이면 크롬에서 접속해주세요
챗방 숨기기 |  챗방 보이기