Локализованный toString () объектов, созданных в ViewModel - PullRequest
0 голосов
/ 20 апреля 2020

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(...), если я забываю это, я замечаю это быстро, но в любом случае, оно подвержено ошибкам. Кроме того, отображаемая строка занимает память.

...