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

Navigation component 시작하기 본문

Android Jetpack Architecture/Navigation

Navigation component 시작하기

hik14 2021. 11. 12. 17:40

1. navi graph 만들기

navigation은 app의 destination(화면)간에 발생합니다.

즉, 사용자는 앱의 모든 위치에서 navigation 할 수 있다. destination(화면)은 작업을 통해 연결됩니다.

 

navi graph 는 모든 destination과 action 포함하는 리소스 xml파일입니다. 그래프는 앱의 모든 path를 나타냅니다.

 

1.  Destinations 은 앱 내부 다양한 컨텐츠를 표현하는 Acticity/Fragment 이다.

2.  Action 사용자가 취할 수 있는 경로를 나타내는 Destinations간의 논리적 연결입니다

 

2.  NavHost를 Activity에 추가하기

navi component 의 핵심 부분 중 하나는 navi host 입니다.

navi host는 사용자가 앱을 탐색할 때 destination이 변경되는 빈 컨테이너입니다.

 

navi host는 NavHost에서 파생되어야 합니다. 

NavHost 구현인 NavHostFragment는 fragment destination 변경을 처리합니다

android:name="androidx.navigation.fragment.NavHostFragment"

app:defaultNavHost="true"

app:navGraph="@navigation/nav_graph"

 

 

android:name -  NavHost 구현의 클래스 이름입니다.

app:navGraph - NavHostFragment를 navi graph와 연결한다.

 

app:defaultNavHost="true"  - NavHostFragment는 system back button을 가로챕니다

 

* 하나의 NavHost만 default이 될 수 있습니다. 동일한 레이아웃에 여러 호스트가 있는 경우(예: 두 개의 창 레이아웃) 기본 NavHost를 하나만 지정해야 합니다.

3. navi graph에  destination 추가하기

기존 Fragment 또는 Activity에서 destination을 만들 수 있습니다.

navi editer 를 사용하여 새 대상을 만들거나 나중에 ragment 또는 Activity으로 대체할 자리 표시자를 만들 수도 있습니다.

 

4. destination  속성 

Type - destination 소스 코드에서 fragment, activity 또는 user custom 클래스로 구현되는지 여부

 

Label - 사용자의 읽기 편의성을위한 destination 이름(toolbar 화면 이름으로 사용된다.)

* setupWithNavController()를 사용하여 NavGraph를 toolbar에 연결하는 경우,  UI에 표시될수 있기에 이 값에 리소스 문자열을 사용하는 것이 좋습니다.

 

ID - 코드에서 대상을 참조하는 데 사용되는 destination ID입니다.

 

name(Class) - destination과 연결된 클래스의 이름이 표시됩니다.

이 드롭다운을 클릭하여 연결된 클래스를 다른 destination 유형으로 변경할 수 있습니다.

 

5. 시작 destination  지정하기.

시작 destination은 사용자가 앱을 열 때 보는 첫 번째 화면이고 사용자가 앱을 종료할 때 보는 마지막 화면입니다.

navi 편집기는 집 아이콘을 사용하여 시작 목적지를 나타냅니다.

 

6. destination  연결

action은 대상 간의 논리적 연결입니다. action은 navi graph에서 화살표로 표시됩니다.

 

action 일반적으로 한 destination을 다른 destination에 연결하지만 앱의 어디에서나 특정 destination으로 이동하는 전역 action을 만들 수도 있습니다.

 

action 통해 사용자가 앱을 통해 취할 수 있는 다양한 경로를 나타낸다, 실제로 destination로 이동하려면 탐색을 수행하는 코드를 작성해주면된다.

 

Type -  “Action”

 

ID - 코드상 id

 

Destination -  도착하려는 destination

 

7. Navigate to a destination

destination탐색은 NavHost 내에서 앱 navi 을 관리하는 객체인 NavController를 사용하여 수행됩니다.

NavHost에는 해당하는 자체 NavController가 있습니다. 

 

NavController를 검색방법

  • Fragment.findNavController()
  • View.findNavController()
  • Activity.findNavController(viewId: Int)

FragmentContainerView를 사용하여 NavHostFragment를 생성하거나,  FragmentTransaction을 통해 Activity에 NavHostFragment를 수동으로 추가하는 경우, Navigation.findNavController(Activity, @IdRes int)를 통해 Activity의 onCreate()에서 NavController를 검색하려는 시도는 실패합니다.  대신 NavHostFragment에서 직접 NavController를 검색해야 합니다.

val navHostFragment =
        supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController
class MainActivity : AppCompatActivity() {

    private var _binding: ActivityMainBinding? = null
    private val binding
        get() = _binding!!
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        _binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
        
//		  네비게이션 컨트롤러를 찾을수 없음	
//        val navController = findNavController(R.id.nav_host_fragment)

        val navHostFragment =
            supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
        val navController = navHostFragment.navController
        
        binding.button.setOnClickListener {
            navController.navigate(R.id.action_firstFragment_to_secondFragment)
        }
    }

}

8.  Safe Args를 사용하여 Type 안전 보장

Safe Args를  plugin 설치후 생성된 코드에는 정의한 각 Action에 대한 클래스(XXXFragmentDirection) 및 메서드와 각 전송 및 수신 Destination에 해당하는 클래스가 포함된다.

 

Safe Args는 Action 시작된 각 Destination에 대한 클래스를 생성합니다.

생성된 클래스 이름은 원래 Destination 클래스 이름에 "Direction"를 추가된다. (XXXFragmentDirection) 

 

생성된 클래스에는 원래 Destination에 정의된 각 Action에 대한 static method가 포함되어 있습니다.

이 메서드는 Action에 필요한 매개변수를 인수로 사용하고 Navigation()에 전달할 수 있는 NavDirections 객체를 반환합니다.

 

 

 

'Android Jetpack Architecture > Navigation' 카테고리의 다른 글

중첩 네비 그래프 (Nested Navi Graph)  (0) 2021.11.19
Navigation graph design 네비 그래프 디자인  (0) 2021.11.18
destinations 생성  (0) 2021.11.15
android navigation의 원칙  (0) 2021.11.12
Navigation  (0) 2021.02.18