web-dev-qa-db-fra.com

Comment obtenir des ressources (R.string) dans viewModel sous Android (MVVM et liaison de données)

J'utilise actuellement databinding et MVVM architecture pour Android. Quel serait le meilleur moyen d'obtenir des ressources de chaîne dans ViewModel. 

Je n'utilise pas le nouveau composant AndroidViewModel, eventbus ou RxJava

Je parcourais l'approche d'interfaces où Activity sera responsable de la fourniture des ressources. Mais récemment, j'ai trouvé une question similaire avec this answer où une classe unique utilisant un contexte d'application fournit toutes les ressources. 

Quelle serait la meilleure approche? ou y a-t-il autre chose que je peux essayer?

9
Shubham

Vous pouvez accéder au contexte en implémentant AndroidViewModel au lieu de ViewModel.

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

Vous pouvez également utiliser l'ID de ressource et ObservableInt pour que cela fonctionne.

ViewModel

val contentString = ObservableInt()

contentString.set(R.string.YOUR_STRING)

Et alors votre vue peut obtenir le texte comme ceci:

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

De cette façon, vous pouvez garder le contexte en dehors de votre ViewModel

3
alisonthemonster