사이드 프로젝트(dogdom #1) Navigation View
XML 작업(View)
안드로이드는 View를 구성하기 위해서 xml이라는 마크업 언어를 사용하는데 여기에는 2가지 방법을 사용한다.(Jetpack Compose 제외)
- CodeBase
- Design Editor
Compose가 아닌 뷰 작업은 xml 파일 생성과 함께 위 2가지 작업을 선택해서 수행해주면 된다.
사용 방법에 대한 자세한 설명은 Android 레이아웃 만들기를 확인해주면 될거 같다
Navigation Component(Jetpack)
그러면 나는 이제 Navigation이라는 화면 이동 라이브러리를 사용했어요.
Navigation에 대한 더욱 자세한 내용은 아래 글을 확인해보면 알 수가 있습니다.
제가 생각하는 Navigaiton의 장점은 하나의 activity만을 생성하여 다수의 fragment를 통해 화면 전환이 가능한 점입니다.
Activity와 Fragment는 무엇인가?
간단하게 설명하자면 Activity는 iOS의 ViewController 처럼 화면에 상호 작용하기 위해서 만들어진 컴포넌트입니다.
Fragment는 Activity를 통해서 존재하는 다양한 화면 구성을 위해서 사용되는 화면이라고 생각하면 됩니다.
독립적으로 존재할 수 없고 반드시 Activity위에서만 존재할 수 있습니다.
대표적인 둘의 차이점으로 Activity는 전체 화면 layout을 모두 차지해야 하는 반면에 fragment는 activity 안에 있는 작은 뷰의 개념으로써 존재하기 때문에 특정 layout(Super View의 크기를 넘어가지 않는 선)에서 layout 배치가 가능합니다.
iOS랑 비슷한 점으로 Navigation Controller가 있고 그위에 ViewController들이 교채되는데 이 점에서 보면 Activity위의 Fragment들이 교채되는것이 어느 정도 비슷하다고 할 수 있을거 같네요
자 그러면 다시 Navigation 설정에 대해서 설명을 드릴건데요
의존성 설정
안드로이드에서는 특정 라이브러리를 사용하기 위해서 반드시 gradle 이라는 것을 설정해줘야 합니다.
gradle 은 Project, Module 수준의 파일이 존재하는데 저는 Module수준의 grandle에 아래 코드를 작성할겁니다.
build.gradle(Module)
dependencies {
// 작성 시점 안정 버전
def nav_version = "2.4.1"
// Kotlin
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
}
위에서 $nav_version은 사용하고자 하는 라이브러리 버전을 입력하면 됩니다.
또 Navigation Component는 Safe Args라는 플러그 인이 있는데 이 플러그인 기능은 각 프래그먼트가 다른 프래그먼트에 데이터를 전달할때 인자를 안전하게 전달해주는 역할을 수행합니다.
이 플러그인 또한 의존성을 따로 추가해 줘야하는데 Safe Args 기능을 사용하지 않는다면 필수는 아니다.
build.gradle(Project)
buildscript {
repositories {
google()
}
dependencies {
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
}
}
build.gradle(Module)
plugins {
// for Java or mixed Java and Kotlin
id 'androidx.navigation.safeargs'
// only for Kotlin
id 'androidx.navigation.safeargs.kotlin'
}
MainFragment 생성
@AndroidEntryPoint
class MainActivity : BaseActivity<ActivityMainBinding>(R.layout.activity_main) {
private val viewModel by viewModels<MainViewModel>()
private var navHostFragment: Fragment? = null
private lateinit var navController: NavController
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
initNavHost()
initBottomMenu()
// setBottomNavigation()
initViewModelCallback()
}
private fun initNavHost() {
navHostFragment = supportFragmentManager.findFragmentById(R.id.main_nav_host)
navController = navHostFragment!!.findNavController()
}
}
Main에 해당되는 Activity에 Navigation의 Host로 연결되어야 하는 fragment를 생성했다.
Fragment의 id값을 xml과 MainActivity의 코드에서 맞춰주면 Navigation에서 위 ID값을 통해 Navigation Host를 만들어줍니다.
private fun initNavHost() {
navHostFragment = supportFragmentManager.findFragmentById(R.id.main_nav_host)
navController = navHostFragment!!.findNavController()
}
그리고 nav_graph 파일을 만들면(만드는 방법은 생략 아래 Navigation Graph 만드는법 참고) 아래처럼 Hosts에 main_nav_host의 ID를 가지는 프래그먼트가 연결되어져 있는 것을 확인 할 수 있습니다.
'AOS' 카테고리의 다른 글
[AOS] 사이드 프로젝트(dogdom #2) ViewBinding (0) | 2024.03.30 |
---|---|
[AOS] 사이드 프로젝트 (dogdom #0) (0) | 2024.03.24 |