web-dev-qa-db-ja.com

Android(MVVMおよびデータバインディング)のviewModelでResources(R.string)を取得する方法

現在、AndroidでdatabindingMVVM architectureを使用しています。 ViewModelで文字列リソースを取得する最良の方法は何でしょうか。

新しいAndroidViewModelコンポーネント、eventbusまたはRxJavaを使用していません

Activityがリソースの提供を担当するインターフェースのアプローチを行っていました。しかし最近、アプリケーションコンテキストを使用する単一のクラスがすべてのリソースを提供している this answerで同様の質問を見つけました。

どちらがより良いアプローチでしょうか?または私が試すことができる何か他のものがありますか?

16
Shubham

ViewModelの代わりにAndroidViewModelを実装することにより、コンテキストにアクセスできます。

class MainViewModel(application: Application) : AndroidViewModel(application) {
    fun getSomeString(): String? {
        return getApplication<Application>().resources.getString(R.string.some_string)
    }
}
23
Expert wanna be

Resource IdとObservableIntを使用して、この作業を行うこともできます。

ViewModel

val contentString = ObservableInt()

contentString.set(R.string.YOUR_STRING)

そして、ビューは次のようなテキストを取得できます。

Android:text="@{viewModel.contentString}"

これにより、ViewModelからコンテキストを排除できます。

4

リソースIDを使用してこの作業を行うことができます。

ViewModel

 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()
        }
    }
}
2
mahdi delavar