LoginSignup
34
25

More than 5 years have passed since last update.

Android Architecture Components + DataBinding で LiveData を使う

Last updated at Posted at 2018-04-02

はじめに

Android Architecture Components を利用した設計でアプリ開発をした際、
ViewModel -> View 間をData Bindingを使って値を反映させたかったのですが、Data BindingではLiveDataをサポートしていませんでした。

Android Studio 3.1からData BindingでLive Dataを使えるようになりました

Updates to data binding
This update includes several improvements for data binding:
・ You can now use a LiveData object as an observable field in data binding expressions. The ViewDataBinding class now includes a new setLifecycle() method that you use to observe LiveData objects.

Android Studio Release Notes に書いてある通り、Android Studio 3.1から LiveData を OservableField として使えると書いてありますので、試しに使ってみました。

サンプル

ボタンを押すと、押した回数がカウントされて、Viewに表示するだけの機能です。

MainViewModel
class MainViewModel : ViewModel() {

    var text: MutableLiveData<String> = MutableLiveData()
    private var count = 0

    fun onClick(view: View) {
        count++
        text.value = "count: $count"
    }
}
MainActivity
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding = DataBindingUtil.setContentView(this, R.layout.activity_main) as ActivityMainBinding
        val viewModel = MainViewModel()

        // ここがポイント
        binding.setLifecycleOwner(this)
        binding.viewModel = viewModel
    }
}
activity_main.xml
<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    >

    <data>

        <variable
            name="viewModel"
            type="jp.yourmystar.livedatabinding.MainViewModel"
            />
    </data>

    <android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >

        <TextView
            android:id="@+id/countText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{viewModel.text}"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            />

        <Button
            android:id="@+id/countButton"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="@{viewModel::onClick}"
            android:text="Button"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toBottomOf="@id/countText"
            />

    </android.support.constraint.ConstraintLayout>
</layout>

重要な部分はMainActivityで、ViewDataBinding#setLifecycleOwner(LifecycleOwner) を使っているところです。
これがないと値が反映されません。

34
25
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
25