Невозможно использовать объекты, добавленные кинжалом в attachBaseContext (), чтобы обновить локаль - PullRequest
0 голосов
/ 13 ноября 2018

Я использую кинжал, и мне нужно обновить локаль в attachBaseContext из activity, я сохраняю логику обновления локали внутри LocaleManager, а экземпляр LocaleManager уже находится внутри appModule, когда я пытаюсь использовать этот экземпляр LocaleManager внутриattachBaseContext Я получаю исключение нулевого указателя, поскольку инъекции активности происходят после attachBaseContext внутри onCreate().

1 Ответ

0 голосов
/ 24 ноября 2018

Это происходит, как вы сказали, потому что инъекция происходит после вызова attachBaseContext.

Я на самом деле не уверен, что за вопрос здесь, но я столкнулся с той же проблемой, но, к сожалению, я не смог решить ее с помощью кинжала. Мне нужно было создать новый LocaleManager в attachBaseContext, например:

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(new LocaleManager(base).updateContext());
}

, где updateContext возвращает контекст с обновленной локалью, например:

public Context updateContext() {
    Locale locale = new Locale(DESIRED_LANGUAGECODE);
    Locale.setDefault(locale);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        return updateResourcesLocale(locale);
    }
    return updateResourcesLocaleLegacy(locale);
}


@SuppressWarnings("deprecation")
private Context updateResourcesLocaleLegacy(Locale locale) {
    Resources resources = mContext.getResources();
    Configuration configuration = resources.getConfiguration();
    configuration.locale = locale;
    resources.updateConfiguration(configuration, resources.getDisplayMetrics());
    return mContext;
}


@TargetApi(Build.VERSION_CODES.N)
private Context updateResourcesLocale(Locale locale) {
    Configuration configuration = mContext.getResources().getConfiguration();
    configuration.setLocale(locale);
    return mContext.createConfigurationContext(configuration);
}
...