Обновление контекста Android для Koin после изменения конфигурации - PullRequest
0 голосов
/ 31 октября 2019

Я работаю над приложением, которое поддерживает несколько языков, поэтому, когда пользователи меняют язык, мы начинаем всплеск активности с флагами Intent.FLAG_ACTIVITY_CLEAR_TOP, FLAG_ACTIVITY_CLEAR_TASK и FLAG_ACTIVITY_NEW_TASK, а затем заканчиваем языковую активность.

Intent mIntent = new Intent(this, SplashActivity.class);
    mIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(mIntent);
    finish();

Мы создали класс-оболочку для обертывания ресурсов приложения

class AppResources(private val context: Context): IAppResources {

    override fun getString(resId: Int): String {
        Logger.i("Current locale language is: ${context.resources.configuration.locale.language}")
        return context.getString(resId)
    }

    override fun getStringArray(resId: Int): Array<String> {
        Logger.i("Current locale language is: ${context.resources.configuration.locale.language}")
        return context.resources.getStringArray(resId)
    }

}

Затем мы внедрили этот класс, используя Koin, вот так

factory<IAppResources> {
        Logger.i("Current androidContext language is: ${androidContext().resources.configuration.locale.language}")
        AppResources(androidContext())
    }

Проблема в том, что когда мы получаем строковое значение изРесурсы мы получили с неправильной локализацией, так как Коин уже начал с предыдущего класса android context и AppResources, уже инициализированного со старым context. Поэтому любые предложения по решению этой проблемы.

1 Ответ

1 голос
/ 31 октября 2019

androidContext() в koin обычно Application Context.

Я полагаю, что код переопределения конфигурации, который вы используете для вашей многоязычной поддержки, применяется только к Activity.

Вам необходимо обернуть контекст приложения с помощью ваших Configuration переопределений внутри factory. Например, что-то вроде

factory<IAppResources> {
    val original = androidContext()
    val config = Configuration().apply {
        setTo(original.resources.configuration)
        setLocale(yourLocale)
    }
    return@factory AppResources(original.createConfigurationContext(config))
}
...