오늘은 안드로이드 스튜디오의 Navigation component 를 사용해보겠습니다!!
공식문서를 보고 개발하는 것을 추천합니다!
https://developer.android.com/guide/navigation
build.gradle(module) 추가
plugins {
id 'kotlin-kapt'
id 'androidx.navigation.safeargs.kotlin'
}
buildFeatures {
viewBinding true
dataBinding true
}
dependencies {
//네비게이션
implementation 'androidx.navigation:navigation-fragment-ktx:2.4.1'
implementation 'androidx.navigation:navigation-ui-ktx:2.4.1'
}
build.gradle(project) 추가
dependencies {
def nav_version = "2.4.1"
classpath("androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version")
}
이제 navigation을 사용할 준비가 되었습니다!
resouce 파일을 추가해줍니다.
res -> android resouce directory 추가 -> resouce type navigation 추가
MainActivity xml 파일
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragmentContainerView"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_graph" />
</androidx.constraintlayout.widget.ConstraintLayout>
여기까지하고 프래그먼트 2개를 추가해줍니다 .
(Class명을 MainFragment 와 SecondFragment 로 만들겠습니다.)
다시 nav_graph로 돌아가서 Design 탭으로 가줍니다 .
상단에 보이는 초록색 플러스 버튼을 눌러줍니다. 그리고 우리가 만들었던 2개의 프래그먼트를 더블클릭하여 추가해줍니다.
그 후에 component Tree 쪽에서 mainFragment를 우클릭하고 set as Start Destination을 설정해줍니다 .
(맨 처음 화면을 어떤 화면으로 설정할지 정하는 것 입니다. )
그렇게 graph 쪽으로 가지고왔으면 mainFragment클릭 후 드래그하여 secondFragment 쪽으로 마우스를 옮기면
선이 이어지는것을 볼 수 있습니다 .
nav_graph 코드입니다.
<?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"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph"
app:startDestination="@id/mainFragment">
<fragment
android:id="@+id/mainFragment"
android:name="com.example.navigation.MainFragment"
android:label="메인화면"
tools:layout="@layout/fragment_main">
<action
android:id="@+id/action_mainFragment_to_secondFragment"
app:destination="@id/secondFragment" />
</fragment>
<fragment
android:id="@+id/secondFragment"
android:name="com.example.navigation.SecondFragment"
android:label="두번째"
tools:layout="@layout/fragment_second" >
</fragment>
</navigation>
여기까지 설정을 하였으면 MainActivity Class로 가서 코드를 설정해줍니다 .
class MainActivity : AppCompatActivity() {
private lateinit var appBarConfiguration: AppBarConfiguration
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//메인 액티비티에 있는 Fragment 변수명 main container
val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragmentContainerView) as NavHostFragment
val navController = navHostFragment.navController
appBarConfiguration = AppBarConfiguration(navController.graph)
setupActionBarWithNavController(navController, appBarConfiguration)
}
override fun onSupportNavigateUp(): Boolean {
val navController = findNavController(R.id.fragmentContainerView)
return navController.navigateUp(appBarConfiguration)
|| super.onSupportNavigateUp()
}
}
이제 프래그먼트들에 버튼을 눌러서 화면이동을 해보겠습니다.
MainFragment
class MainFragment : Fragment() {
private lateinit var binding: FragmentMainBinding
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
binding = FragmentMainBinding.inflate(inflater,container,false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.btnMain.setOnClickListener {
findNavController().navigate(R.id.action_mainFragment_to_secondFragment)
}
}
fragment_main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainFragment">
<Button
android:id="@+id/btn_main"
android:text="버튼"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</FrameLayout>
SecondFragment Class
class SecondFragment : Fragment() {
private lateinit var binding: FragmentSecondBinding
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentSecondBinding.inflate(inflater,container,false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
}
}
fragment_second.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SecondFragment">
<TextView
android:id="@+id/tvText"
android:layout_width="match_parent"
android:gravity="center"
android:layout_height="match_parent"
android:text="두번째" />
</FrameLayout>
여기까지 간단하게 navigation 을 사용해봤습니다!
'안드로이드' 카테고리의 다른 글
[Android/Kotlin] Google TTS 사용법 (0) | 2022.03.24 |
---|---|
[Android / Kotlin] Navigation 사용하기 2 (Bottom Navigation) (0) | 2022.03.23 |
[Android/Kotlin] Hilt 사용하기 ! (0) | 2022.03.08 |
[Android] 카카오맵 Api 길 찾기 (카카오맵 연동) (0) | 2022.03.03 |
[android / Kotlin] 카카오맵 Api 장소 검색 결과 리사이클러 뷰에 추가하기 (9) | 2022.03.03 |