Как мне получить ресурсы (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);