我正在使用 dagger,我必须更新 attachBaseContextactivity 中的区域设置,我将区域设置更新逻辑保留在 LocaleManager 中,LocaleManager 实例已经在 appModule 中,当我尝试在 attachBaseContext 中使用此 LocaleManager 实例时,我得到空指针异常
因为 Activity 的注入(inject)发生在 attachBaseContext 内的 onCreate() 之后。

最佳答案

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

我实际上不确定这里的问题是什么,但我面临着同样的问题,但不幸的是我无法用 dagger 解决它。我需要在 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);
}

关于android - 无法在 attachBaseContext() 中使用 dagger-injected 对象来更新语言环境,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53277662/

10-08 22:33