[Android開発ネタ] DataBinding + LiveDataでViewをイジイジしてみる

LiveDataって言う存在を最近知ったので、、、。
超今更感だとは思うけど、、、、。
単純なLiveDataの使い方はLiveDataをActivityなりFragmentなりでovserveして値が変更されたらViewを書き換えるとかだと思う。
思う、、、。
た、多分、、、、。
Viewを書き換えるだけだったらBindingで行けるんじゃない?と思い調べたらやり方あったのでメモ的にサンプル書いた。
build.gradleに以下を追加。

implementation 'android.arch.lifecycle:extensions:1.1.1'

activity_main.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="vm"
    type="com.example.livedatatest.HogeViewModel"/>
</data>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{vm.text}"
    tools:text="テキスト"/>
<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="HOGE"
    android:onClick="@{vm::hogeButtonClick}"/>
</LinearLayout>
</layout>

HomeViewModel

class HogeViewModel : ViewModel() {
    var text = MutableLiveData<String>()
    fun hogeButtonClick(view: View) {
        if (TextUtils.isEmpty(text.value)) {
            text.postValue("HOGE")
        } else {
            text.postValue(text.value + "HOGE")
        }
    }
}

MainActivity

class MainActivity : AppCompatActivity() {
    private val binding: ActivityMainBinding by lazy {
    DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
    }
    override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      binding.setLifecycleOwner(this)
      binding.vm = ViewModelProviders.of(this).get(HogeViewModel::class.java)
    }
}

これでHOGEボタン押したらHOGEって文字が増殖するアプリの出来上がりw
xmlにonClickを書くのは少しやりすぎな感じもするけど、xmlで諸々完結できてしまうのは良いなって思う。
新規アプリとか担当することになったらとりあえず、LiveDataは活用していこうかと思う。

タイトルとURLをコピーしました