오늘도 더 나은 코드를 작성하였습니까?

navigation event listener 본문

Android Jetpack Architecture/Navigation

navigation event listener

hik14 2021. 11. 26. 19:22

NavController와의 상호작용은 destination 간 탐색을 위한 기본 방법입니다.

 NavController NavHost의 콘텐츠를 새로운 destination으로 대체합니다

 

 대부분의 경우 UI 요소(예: 상단 AppBar 또는 BottomNavigationBar 같은 기타 영구 탐색 컨트롤)는 NavHost 외부에 존재하며 대상 간을 탐색할 때 업데이트되어야 합니다

 

NavController는 NavController의 현재 destination 또는 그 인수가 변경될 때 호출되는 OnDestinationChangedListener 인터페이스를 제공합니다.  리스너는 addOnDestinationChangedListener() 메서드를 통해 등록될 수 있습니다.

 

addOnDestinationChangedListener()를 호출할 때 현재 destination 있다면 즉시 리스너로 전송됩니다.

NavigationUI는 OnDestinationChangedListener를 사용하여 이런 공통 UI 구성요소가 탐색을 인식하도록 합니다.

 

 

OnDestinationChangedListener를 자체적으로 사용하여 모든 맞춤 UI 또는 비즈니스 로직이 탐색 이벤트를 인식하도록 할 수도 있습니다. 예를 들어 앱의 일부 영역에서는 표시하고 다른 영역에서는 숨기려는 공통 UI 요소가 있을 수 있습니다. 다음 예에서와 같이 자체 OnDestinationChangedListener를 사용하면 타겟 대상에 따라 이러한 UI 요소를 선택적으로 표시하거나 숨길 수 있습니다.

q2

navController.addOnDestinationChangedListener { _, destination, _ ->
   if(destination.id == R.id.full_screen_destination) {
       toolbar.visibility = View.GONE
       bottomNavigationView.visibility = View.GONE
   } else {
       toolbar.visibility = View.VISIBLE
       bottomNavigationView.visibility = View.VISIBLE
   }
}

Argument-based listeners

 

다른 방법으로는 navi graph 내에서 default value가 지정된 argument를 사용할 수도 있습니다.

argument는 해당 UI 컨트롤러에서 상태를 업데이트하는 데 사용할 수 있습니다.

 

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/navigation\_graph"
    app:startDestination="@id/fragmentOne">
    <fragment
        android:id="@+id/fragmentOne"
        android:name="com.example.android.navigation.FragmentOne"
        android:label="FragmentOne">
        <action
            android:id="@+id/action\_fragmentOne\_to\_fragmentTwo"
            app:destination="@id/fragmentTwo" />
    </fragment>
    <fragment
        android:id="@+id/fragmentTwo"
        android:name="com.example.android.navigation.FragmentTwo"
        android:label="FragmentTwo">
        <argument
            android:name="ShowAppBar"
            android:defaultValue="true" />
    </fragment>
</navigation>

이 argument는 destination로 이동할 때 사용되지 않고 defaultValue를 사용하여 destination에 추가 정보를 첨부하는 방법으로 사용됩니다. destination에 있을 때 앱 바를 표시할지 여부를 나타냅니다.

navController.addOnDestinationChangedListener { _, _, arguments ->
    appBar.isVisible = arguments?.getBoolean("ShowAppBar", false) == true
}

 

NavController는 탐색 destination이 변경될 때마다 이 콜백을 호출합니다.

Activity는 이제 콜백에서 수신된 인수를 기반으로 소유한 UI 구성요소의 상태 또는 가시성을 업데이트할 수 있습니다.

 

이 접근 방식의 한 가지 장점은 Activity가 navi graph의 argument만 보고 개별 Fragment 역할과 책임을 알지 못한다는 것입니다.

개별 프래그먼트는 포함하는 Activity 및 소유하는 UI 구성 요소에 대해 알지 못합니다.