[안드로이드/Android/Kotlin] Activity / Fragment에서 Databinding 사용하기(ViewModel 이용)

SooYeon Yeon·2022년 2월 24일
0

안드로이드/Android

목록 보기
22/25

build.gradle

android {
dataBinding {
        enabled = true
    }
}

Activity에서 Databinding 사용하기(ViewModel 사용)

activity.xml

  • 태그로 전체 감싸기
  • 태그로 viewModel 작성
  • Databinding이 필요한 곳에서 쓰기
  • 변수 사용 시 android:text="@{viewModel.text}" 다음과 같이 사용
  • 함수 사용 시 android:onClick="@{ () -> viewModel.onClickButton() }"
<?xml version="1.0" encoding="utf-8"?>
<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>
    <variable
        name="viewModel"
        type="com.example.databindingexample.viewmodel.ExampleViewModel" />
</data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

        <TextView
            android:id="@+id/text_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{viewModel.text}"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"/>
			<Button
							...
						android:onClick="@{ () -> viewModel.onClickButton() }"
							...                                          />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

MainActivity.kt

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
		private lateinit var mExampleViewModel: ExampleViewModel
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
				binding.viewModel = mExampleViewModel
				binding.lifecycleOwner = this
				// textview 사용하고 싶을 때 binding.textview ~ 이런 식으로 사용
	    }
    }
}

private fun initViewModel() {
        mExampleViewModel =
            ViewModelProvider.AndroidViewModelFactory.getInstance(requireActivity().application)
                .create(ExampleViewModel::class.java)
        mExampleViewModel.BtnClickEvent.observe(viewLifecycleOwner, Observer {
            // 실행 내용
        })
    }

ExampleViewModel.kt

class ExampleViewModel(application: Application) : AndroidViewModel(application) {

    val text = MutableLiveData("")
    val BtnClickEvent = SingleLiveEvent<Any>()

    fun onClickButton() {
        BtnClickEvent.call()
    }

}

Fragment에서 Databinding 사용하기

다른 것들은 Activity와 동일

Fragment.kt

class ExampleFragment : Fragment() {
  private lateinit var binding: FragmentBeforeBinding
  @Override
  override fun onCreateView(
      inflater: LayoutInflater,
      container: ViewGroup?,
      savedInstanceState: Bundle?
  ): View? {
      binding = DataBindingUtil.inflate(inflater, R.layout.fragment_before, container, false)
     
      return binding.root
  }
}

0개의 댓글