无法在 AttachBaseContext() 中使用匕首注入的对象来更新语言环境

use*_*279 5 android dagger android-7.0-nougat

我正在使用 dagger,并且必须更新 中的语言环境attachBaseContextactivity我将语言环境更新逻辑保留在 LocaleManager 中,并且 LocaleManager 实例已经在 appModule 中,当我尝试在 AttachBaseContext 中使用此 LocaleManager 实例时,我得到空指针异常作为活动的注射发生在attachBaseContext内部 之后onCreate()

Ana*_*zer 3

正如您所说,这种情况正在发生,因为注入是在attachBaseContext调用之后发生的。

我实际上不确定这里的问题是什么,但我面临着同样的问题,但不幸的是我无法用匕首解决它。LocaleManager我需要像这样创建一个新的attachBaseContext

@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(new LocaleManager(base).updateContext());
}
Run Code Online (Sandbox Code Playgroud)

whereupdateContext返回具有更新的区域设置的上下文,如下所示:

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);
}
Run Code Online (Sandbox Code Playgroud)