<aside> 🎯 - Databinding / Navigation / Retrofit
</aside>
코드 정리 단축키 : ctrl + alt + l
room에서 코루틴 사용하려면 build.gradle(app)에 추가
implementation "androidx.room:room-ktx:$room_version"
정리
xml 파일에 data를 연결해서 사용하는 것
activity에 따로 view 정의하지 않아도 되고, livedata를 binding 하면 data가 변할때마다 view refresh할 필요 없음
사용법
build.gradle(app)에 추가
android{
buildFeatures {
dataBinding true
}
}
dependencies {
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
}
xml 파일 최상단에 layout, data 태그 추가
<layout 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>">
<data>
<!--객체화하고싶은 viewModel-->
<variable
name="viewModel"
type="konkuk.yeonj.jetpackexample.MainViewModel" />
</data>
</layout>
MainActivity의 onCreate 내부
//setContentView(R.layout.activity_main)
val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
// lifecyclerOwner 넣어줘야 livedata를 관찰해서 화면 refresh 가능
binding.lifecycleOwner = this
binding.viewModel = mainViewModel
xml에서 viewModel의 LiveData 변수 접근할수 있도록 public 변수 할당
var todos: LiveData<List<Todo>>
init {
todos = getAll()
}
fun getAll(): LiveData<List<Todo>> {
return db.todoDao().getAll()
}
xml의 view에 databinding
<TextView
android:text="@{viewModel.todos.toString()}"
</TextView>
<EditText
android:text="@={viewModel.newTodo}"
</EditText>
<Button
android:onClick="@{() -> viewModel.insert(viewModel.newTodo)}"
</Button>
장점
parameter 받아서 instance 생성하는 코드 필요 없음
call back을 통해 fragment간 전환 필요 없음
사용법
res/navigation/nav_graph.xml 생성
mainFragment, secondFragment 추가 후 화면 전환 방향(main → second)으로 화살표 만들기
activity_main.xml에 navgraphhost 추가
mainFragment의 버튼 클릭했을때 secondFragment로 넘어가도록 clicklistener 추가
button.setOnClickListener {
findNavController().navigate(R.id.action_mainFragment_to_secondFragment)
}
appbar에 fragment label 표시, 뒤로가기 적용
private lateinit var appBarConfiguration: AppBarConfiguration
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val navHostFragment =
supportFragmentManager.findFragmentById(R.id.fragment) as NavHostFragment
val navController = navHostFragment.navController
appBarConfiguration = AppBarConfiguration(navController.graph)
setupActionBarWithNavController(navController, appBarConfiguration)
}
override fun onSupportNavigateUp(): Boolean {
val navController = findNavController(R.id.fragment)
return navController.navigateUp(appBarConfiguration)
|| super.onSupportNavigateUp()
}
fragment 넘어갈때 인자 전달하기
nav_graph.xml에서 받는 fragment에 argument 추가
MainFragment에서 인자 전달하기
button.setOnClickListener {
val action = MainFragmentDirections.actionMainFragmentToSecondFragment("Hello")
findNavController().navigate(action)
}
SecondFragment에서 인자 받기
val args: SecondFragmentArgs by navArgs()
textView.text = args.text
retrofit으로 네트워크 통신해서 json data 가져오고 Moshi 이용해서 사용하기 쉽게 json data를 class로 convert