現在、Androidでdatabinding
とMVVM architecture
を使用しています。 ViewModelで文字列リソースを取得する最良の方法は何でしょうか。
新しいAndroidViewModel
コンポーネント、eventbus
またはRxJava
を使用していません
Activityがリソースの提供を担当するインターフェースのアプローチを行っていました。しかし最近、アプリケーションコンテキストを使用する単一のクラスがすべてのリソースを提供している this answerで同様の質問を見つけました。
どちらがより良いアプローチでしょうか?または私が試すことができる何か他のものがありますか?
ViewModelの代わりにAndroidViewModelを実装することにより、コンテキストにアクセスできます。
class MainViewModel(application: Application) : AndroidViewModel(application) {
fun getSomeString(): String? {
return getApplication<Application>().resources.getString(R.string.some_string)
}
}
Resource IdとObservableIntを使用して、この作業を行うこともできます。
ViewModel:
val contentString = ObservableInt()
contentString.set(R.string.YOUR_STRING)
そして、ビューは次のようなテキストを取得できます。
Android:text="@{viewModel.contentString}"
これにより、ViewModelからコンテキストを排除できます。
リソースIDを使用してこの作業を行うことができます。
val messageLiveData= MutableLiveData<Any>()
messageLiveData.value = "your text ..."
または
messageLiveData.value = R.string.text
そして、次のようなフラグメントまたはアクティビティで使用します。
messageLiveData.observe(this, Observer {
when (it) {
is Int -> {
Toast.makeText(context, getString(it), Toast.LENGTH_LONG).show()
}
is String -> {
Toast.makeText(context, it, Toast.LENGTH_LONG).show()
}
}
}