My ViewModel
создает объекты, которые затем используются в представлении. Моя проблема в том, как мне лучше локализовать возвращаемое значение toString()
для объектов, созданных в ViewModel
?
В качестве сокращенного примера давайте предположим, что у меня есть объект, описывающий точку, используя свойство amount
и свойство unit
. amount = 1
и unit = "year"
должны дать 1 year
на английском языке sh и 1 Jahr
на немецком языке.
В настоящее время я делаю следующее:
ViewModel
val liveData = MutableLiveData<Duration>(Duration(1, "year"))
Представление (внутри Fragment.onCreateView)
viewModel.liveData.observe(viewLifecycleOwner) {
it.renderString(requireContext())
// work with "it"
}
и мой класс Duration выглядит так
class Duration(val amount: Int, val unit: String) {
private var _renderedString: String? = null
// will be called from the view (Fragment)
// and its context will be passed in
fun renderString(context: Context) {
_renderedString = context.resources.getQuantityString(R.plurals.numberOfYears, amount, amount)
}
override fun toString(): String {
return if(_renderedString != null) {
_renderedString!!
} else {
"amount = $amount, unit = $unit"
}
}
}
Это прекрасно работает, даже при изменении конфигурации обновленная строка обновляется. Однако мне интересно, есть ли более элегантные или более простые способы? Особенно мне всегда приходится звонить renderString(...)
, если я забываю это, я замечаю это быстро, но в любом случае, оно подвержено ошибкам. Кроме того, отображаемая строка занимает память.