728x90
반응형
프레그먼트에서 데이터 바인딩 하는 것을 연습 겸 기록
1. 설정
Module : Gradle 에 추가
buildFeatures {
dataBinding true
}
plugins {
...
id 'kotlin-kapt'
}
2. 구현
프래그먼트 내부 설정
<Fragment>
// 1. 바인딩 객체를 선언
lateinit var binding : FragmentLoginMainFragmentBinding
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// 2. 바인딩 하기
binding = DataBindingUtil.inflate(
inflater,
R.layout.fragment_login_main_fragment,
container,
false)
// => 데이터 바인딩 이전 사용
//var view = inflater.inflate(R.layout.fragment_login_main_fragment, container, false)
//initView(view)
//return view
return binding.root
}
<XML>
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="fragment"
type="kr.appgrider.mvpGame.login.LoginMainfragment" />
</data>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
tools:context="kr.appgrider.mvpGame.login.LoginMainfragment">
<EditText
android:id="@+id/et_id"
android:hint="id"
android:layout_width="match_parent"
android:layout_height="50dp" />
<EditText
android:id="@+id/et_pass"
android:hint="pass"
android:layout_width="match_parent"
android:layout_height="50dp" />
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/btn_login"
android:text="Login"
android:layout_width="match_parent"
android:layout_height="50dp"
android:onClick="@{() -> fragment.checkInput(etPass.getText().toString(),etId.getText().toString())}"
/>
<androidx.appcompat.widget.AppCompatButton
android:id="@+id/btn_signUp"
android:text="SignUp"
android:layout_width="match_parent"
android:layout_height="50dp"
android:onClick="@{()->fragment.gotoPage(1)}"
/>
</androidx.appcompat.widget.LinearLayoutCompat>
</layout>
<Fragment>
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// 2. 바인딩 하기
binding = DataBindingUtil.inflate(
inflater,
R.layout.fragment_login_main_fragment,
container,
false)
binding.fragment = this
// => 데이터 바인딩 이전 사용
//var view = inflater.inflate(R.layout.fragment_login_main_fragment, container, false)
//initView(view)
//return view
return binding.root
}
fun gotoPage(screen : Int){
when(screen){
1 ->{
findNavController().navigate(R.id.action_loginMain_fragment2_to_loginSignUp_fragment2)
}else->{
}
}
}
fun checkInput(){
Log.d("WLOG","checkInput")
}
주의사항
Fragment의 Lifecycle로 인해 메모리 누수가 발생할 수 있기 때문입니다.
예를들어 Fragment에서 Navigation component 또는 BackStack or detach를 사용하는 경우, onDestroyView() 이후에 Fragment view는 종료되지만, Fragment는 여전히 살아 있습니다. 즉 메모리 누수가 발생하게 됩니다.
▶ 그래서 반드시 binding 변수를 onDetsroyView() 이후에 null로 만들어 줘야합니다.
출처: https://yoon-dailylife.tistory.com/57 [알면 쓸모있는 개발 지식]
fun API_siguUp(){
binding.unbind() // 메모리 릭 방지
findNavController().popBackStack()
}
728x90
반응형
'Android AAC' 카테고리의 다른 글
MVVM : RecyclerView, LiveData (0) | 2022.03.28 |
---|---|
DATA_Binding : RecyclerView in fragment (0) | 2022.03.11 |
MVVM LiveData (1) (0) | 2021.02.22 |
Android AAC : LiveData (0) | 2021.01.07 |
Android ACC : Data Binding (0) | 2021.01.06 |