Navigation
네비게이션은 Application 자체의 화면 구성을 쉽게 구현하고 화면의 흐름을 시각적으로 보여줄 수 있는 구성 요소이다.
기존 Activity or Fragment들 간 데이터 전달 or 화면 이동과 같이 이동되어야 하는 code 구현을 심플하고 안정적으로 처리한다.
개발자가 정의한 UI Graph를 기반으로 화면을 쉽게 전환하고, 유지보수가 매우 쉬워진다
NavGraph(탐색 그래프)
- 모든 탐색 관련 정보가 하나의 중심 위치에 모여 있는 XML 리소스. Destinations과 이들을 연결하는 Actions들을 시각화해서 볼 수 있다.
- Destinations이란 Navigation을 이용해 이동하는 앱의 목적지를 의미
NavHost
- 탐색 그래프에서 대상을 표시하는 빈 컨테이너. NavGraph에 정의한 Desination들을 보여주기 위해 NavHostFragment를 이용
NavController
- NavHost에서 앱 탐색을 관리하는 객체이다. NavController는 사용자가 앱 내에서 이동할 때 NavHost에서 대상 콘텐츠의 전환을 설정, 관리, 조정한다.
구현
build.gradle (:app)
implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5'
implementation 'androidx.navigation:navigation-ui-ktx:2.3.5'
Navigation 디렉토리를 만든 후 조작할 navigation인 nav_main을 만들고 생성한 Fragment들 추가
app:startDestination 속성으로 실행 시 기준(home)이 되는 클래스를 지정
(디자인으로 추가시 첫 추가하는 Fragment가 자동으로 startDestination 속성으로 부여됨)
Activity layout에 Host를 담당할 Fragment 추가
Fragment에 지정한 NavHostFragment란 Fragment를 상속하고 NavHost 인터페이스를 구현하는 클래스
app:defaultNavHost 속성의 경우 System의 back button 이벤트를 가져와 처리 가능하게 한다.
Navigation - Action
- Navigation()의 이동 정보를 정의하는 인자
- NavGraph에서 Action은 시각적으로 app의 path를 보여줌 (경로)
- Action은 argument, backstack behavior 같은 속성들을 가질 수 있음
각 화면을 선택해 점들을 끌어 다른화면에 위치시키면 action이 지정 된다.
위처럼 Action이 적용되어 있다면 xml은 오른쪽과 같이 작성되어 있을 것이다. action이 가지고 있는 destination(목적지)으로 navigation이 진행된다.
이렇게 추가해준 action은 논리적 연결일 뿐 코드에서 사용하여 물리적 연결을 해야 한다.
각각의 Fragment에서 버튼을 클릭할때 NavController로 지정한 action id를 이용해 navigate 하면 해당 action을 따라 화면을 이동한다.
버튼을 클릭할때 지정한 destination으로 이동하며 이전 Fragment가 스택에 쌓이게 되며 뒤로가기 키를 누를시 이전 Fragment로 돌아온다
destination으로만 구성된 그래프는 스택에 계속해서 쌓이게 된다. Back 키를 계속 누르면 최초 프래그먼트 스택까지 도달해야 back 키로 앱종료
그렇기에 action스택을 관리하기 위해 backstack behavior 속성을 지원한다.
Action의 속성 순서로는 pop속성이 먼저 실행되고 이후 detination이 실행된다.
아래 코드를 실행하면 stack에 Third 프래그먼트는 없어진 채로 destination이 실행되어 First가 쌓이게 된다.
아래 코드로 실행하면 stack에 Second 프래그먼트 까지 없어진채로 실행되어 First가 쌓인다.
이렇게 되면 destination으로 인해 First는 stack 두번 쌓이게 된다.
Third 프래그먼트에 버튼을 클릭하였을때 최초 First 프래그먼트로 돌아오려면 Third 프래그먼트 action에 destination을 지운 후, Second를 포함해 stack을 지우거나 app:popUpTo="@id/firstHomeFragment" 만 주어 action을 실행하면 최초 First 프래그먼트로 돌아온다
BottomNavigation
Activity 코드에 setupWithNavController() 함수 사용 NavigationUI.setupWithNavController는 view와 navController를 인자로 받아 view를 navController에 맞게 구현.
이 과정에서 bottomNavigation의 menu값의 id와 fragment 목적지가 자동으로 맵핑
Menu와 Fragment id가 맵핑되어 BottomNavigation의 item을 눌러도 Fragment 이동이 되고 기존 navGraph를 이용하여 스택관리에 맞춰 Fragment 이동을 할 때도 메뉴가 알아서 바뀌는 모습이다.
BottomNavigation은 많은 수의 Tab(Item)들을 넣기엔 부적절하여 개발 계획에 따라 TabLayout을 사용하여 TabSelectListner를 통해 NavController를 조작해 Fragment를 변경해도 될 것 같다.
Argument
말 그대로 각각의 화면에서 인자로 받는 값
Array와 Optional(Nullable) 타입이 가능할 뿐만 아니라 enum, Parceble 값도 가능하고 기본값도 설정 가능하기 때문에 이전처럼 Bundle에 putString, putInt을 할 필요가 없음
만약 스택에 쌓였던 이전 Fragment들이 메모리에서 정리된다면 인자로 받은 Argument를 기준으로 다시 생성
BottomNavigationView 클릭시 Fragment Replace 막기
'Android > Library' 카테고리의 다른 글
GeoCoding 위도 경도 <-> 주소 변환하기 (4) | 2022.02.20 |
---|---|
Google Map API 사용 방법 및 예제 (0) | 2022.02.18 |
Epoxy, Epoxy에 Databinding 사용 (RecyclerView 쉽게 사용) (0) | 2022.02.14 |
Android Room Database / 룸 데이터 베이스 (0) | 2022.01.14 |
Hilt로 의존성 주입 (DI/Dependency Injection) (0) | 2021.08.30 |