初投稿になります。Androidの便利な機能であるDataBindingとViewModelの基本的な扱いに関してまとめていきたいと思います。
学習途中でまとめているので順次更新していきたいと思っています。
DataBinding
下準備
まずはDataBindingを使用するためにgradleファイルへの書き込みをおこないます。
android {
dataBinding {
enabled = true
}
}
レイアウトxmlの準備
Layoutのxmlの準備をしていきます。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="data" type="com.example.test.main.MainViewModel" />
</data>
<android.support.constraint.ConstraintLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/textView"
android:text="@{data.text}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"/>
</android.support.constraint.ConstraintLayout>
</layout>
こちらには少し注意点があります。
・親のレイアウトはlayoutであること。
・こちら一度書き込んだあとbuildしないとdatabindingをする際に自動的に作成されるファイルがないとエラーが出るのでbuildをしてから実行します。
ではこちらのファイルの説明をしていきます。
まずはの部分です。
こちらはnameの部分が変数名、typeの部分が参照するクラス名と考えるのがわかりやすいかなと思います。
今回はname="data"として使用しています。参照しているViewModelは後述していきます。
TextViewを見てみると
android:text="@{data.text}"
という箇所があります。ここがtextとdata.textをBinding(紐付け)している箇所になります。
ここではtextにMainViewModel内の変数textを表示するようにBindingを行なっています。
###ViewModel
ViewModelは先ほど定義したMainViewModelを使用します。
中身はこんな感じです。
class MainViewModel : ViewModel() {
val text: MutableLiveData<String> = MutableLiveData()
init {
text.value = "aaa"
}
}
textにはLiveDataを使用しています。
LiveDataに関してはこちらを参照
text.valueに初期値を設定することで、その値がLayout内にも反映がされます。
Fragment
最後にFragmentです。
class MainFragment : Fragment() {
private var binding: MainFragmentBinding? = null
private var mainViewModel: MainViewModel? = null
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = MainFragmentBinding.inflate(inflater, container, false)
binding!!.lifecycleOwner = this
return binding!!.root
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
mainViewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
binding!!.data = mainViewModel
}
}
これでDataBindingの使用ができます。
onCreateView内を見てみます。
binding = MainFragmentBinding.inflate(inflater, container, false)
ここはBindingのインスタンスの取得をしています。
返すViewにはbinding!!.root
を指定してください。
そしてonActivityCreated内です。
mainViewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
ここでViewModelのインスタンスを取得しています。
binding!!.data = mainViewModel
ここのdataはmain_fragment.xmlでname="data"として設定した名前になります。
間違いありましたらご指摘お願いします。
追々肉付けしていけたらと思います。