안드로이드의 jetpack에는 navigation이라는 라이브러리가 존재합니다.
기본적으로 fragment들의 이동, 스택을 관리하기 위한것이며 많은 어플에서 바텀 메뉴를 사용하고
액티비티보단 fragment로 화면을 구성하기 때문에 반드시 익혀두어야 할 라이브러리중 하나라고 생각합니다.

이번에 제가 다룰 케이스는 바텀네비게이션의 응용입니다.
네비게이션은 이동할 때마다 계속해서 스택을 쌓습니다.
예를들어 main - scrap - search - mypage와 같이 4개의 화면이 있다고 가정을 해봅시다.
편의상 1,2,3,4라고 부르겠습니다.

1에서 2로, 2에서 3으로, 3에서 4로 이동하게 되면 스택은 FILO 선입 후출 형태로

4

3

2

1

과 같이 쌓일것입니다. 만약 4에서 백스택을 한다면

3

2

1

이 될것입니다. 이처럼 백스택을 관리할때에는 popupto와 popupinclusive를 이용하여 다룰 수 있습니다.

popupto 는 팝업시 어디까지 팝업을 시킬지를 정하는 것입니다.

<action
      android:id=="@+id/action__fragment3_to_fragment4"
      app:destination="@id/fragment4"
      app:popUpTo="@id/fragment2"
      app:popUpToInclusive="false"/>

위의 코드는 3에서 4로 이동하는 코드 입니다. 위의 코드에서는 popupto = 2로 되어있으므로
1 - 2 - 3 - 4 로 이동 후에 4에서 뒤로가기 (=팝업)을 하게 된다면 3이 아닌 2로 돌아갈 것입니다.
만약에 popuptoInclusive를 false가 아닌 true로 설정하게 된다면 2또한 스택에서 제거하여
1로 돌아가게 됩니다.

이처럼 스택관리 또한 간단합니다.
하지만 1 -2 - 3 - 4 - 3 - 2 - 3 - 4 - ....과같이 계속해서 이동을 한다면 어떻게 될까요?
사용자가 백버튼을 이용하여 앱을 종료하고 싶다면 계속해서 백버튼을 클릭할것이고 모든 스택이 사라지기 전까지 화면을 이동하고 다닐것입니다.

저의 경우에는 만약 1번에서 백버튼을 클릭한다면 스택과 상관없이 종료를 하는 로직을 만들고 싶었고 그를 위해서 jetpack navigation에 관련되서 검색을 했지만 전부 popupto, Popuptoinclusive에 관한 글만 나왔습니다.

정답은 바텀메뉴에 있었습니다.

<item
        android:id="@+id/homeMainFragment"
        android:icon="@drawable/ic_home"
        android:title="@string/home" />
    <item
        android:id="@+id/scrapMainFragment"
        android:icon="@drawable/ic_scrap"
        android:menuCategory="secondary"
        android:title="@string/scrap" />
    <item
        android:id="@+id/searchFragment"
        android:icon="@drawable/ic_search"
        android:menuCategory="secondary"
        android:title="@string/search" />
    <item
        android:id="@+id/mypageMainFragment"
        android:icon="@drawable/ic_mypage"
        android:menuCategory="secondary"
        android:title="@string/mypage" />

다음은 res - menu의 바텀 메뉴 xml입니다.

이곳에서는 바텀메뉴에 대한 설정을 진행합니다. 이곳에서 menuCategory라는 속성이 있습니다.

이 항목은 메뉴 항목의 사항들을 그룹으로 묶는 역할을 하고 우선순위를 정의합니다.

이곳에서 scrap,search,mypage를 secondary를 이용하여 한 그룹으로 묶고
main버튼을 그룹에서 제외합니다.

이렇게 된다면 1- 2- 3 - 4 에서 이동하다가 1 에서 백버튼을 누르게 된다면 1의 그룹이 없기 때문에 맨 마지막 스택으로 여겨지고 앱이 종료될수 있습니다.

profile
러닝커브를 따라서 등반중입니다.

0개의 댓글