Как мне получить ресурсы (R.string) в viewModel в Android (MVVM и привязка данных)

В настоящее время я использую databinding и MVVM architecture для Android. Каким будет лучший способ получить строковые ресурсы в ViewModel.

Я не использую новый AndroidViewModel компонент, eventbus или RxJava

Я прошел через apraach интерфейсов, где Activity будет отвечать за предоставление ресурсов. Но недавно я нашел аналогичный вопрос с этим ответом, когда один класс, использующий контекст приложения, предоставляет все ресурсы.

Какой будет лучший подход? или есть что-то еще, что я могу попробовать?

Ответ 1

Вы можете получить доступ к контексту, внедрив AndroidViewModel вместо ViewModel.

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

Ответ 2

Вы также можете использовать Resource Id и ObservableInt, чтобы сделать эту работу.

ViewModel:

val contentString = ObservableInt()

contentString.set(R.string.YOUR_STRING)

И тогда ваш взгляд может получить такой текст:

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

Таким образом, вы можете сохранить контекст вне вашей ViewModel

Ответ 3

Вы также можете использовать Resource 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()
        }
    }
}

Ответ 4

Создайте класс MyApplication, который простирается от приложения, и вы можете использовать его во всех действиях и классах.

MyApplication.getContext().getResources().getString(R.string.blabla);