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は活用していこうかと思う。