Привет всем разработчикам Android, мне нужно прояснить сомнение в отношении управления динамическими ресурсами в приложениях Android.
Мне нужно, чтобы мое приложение использовало переводы, возвращаемые моим бэкэндом, в зависимости от языка, настроенного на телефоне.
Я хотел элегантно реализовать его, работая над пользовательским LayoutInflater , который применяет ViewTransformer в зависимости от типа графического компонента.
Каждый ViewTransformer будет собирать только идентификатор (например, @ id / landing_welcome_text) и делать следующий вызов:
val value = attrs.getAttributeValue(index)
if (value != null && value.startsWith("@")) {
val text = view.context.resources.getString(attrs.getAttributeResourceValue(index, 0))
setTextForView(view, text)
}
Был реализован ContextWrapper, который возвращает мой пользовательский LayoutInflater и реализацию ресурса
override fun getSystemService(name: String): Any {
return if (Context.LAYOUT_INFLATER_SERVICE == name)
CustomLayoutInflater(
LayoutInflater.from(baseContext),
this,
viewTransformerManager
)
else
super.getSystemService(name)
}
override fun getResources(): Resources = customResources
Проблема в том, что перезапись поведения класса Resources считается устаревшей стратегией.
Как сказано в документации:
Этот конструктор устарел. Ресурсы не должны создаваться
Программы. См. Context.createConfigurationContext (Configuration).
class CustomResourcesWrapper constructor(
res: Resources,
private val languageStringRepo: ILanguageStringRepo
): Resources(res.assets, res.displayMetrics, res.configuration) {
@Throws(Resources.NotFoundException::class)
override fun getString(id: Int): String {
val value = getStringFromRepository(id)
return value ?: super.getString(id)
}
}
Кто-нибудь знает, как я могу получить такую же функциональность, не перезаписывая класс Resources?
Большое спасибо за помощь:)