Android 공부/Android AAC

DATA_Binding : Fragment

Machine_웅 2022. 3. 10. 13:36
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 공부 > 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