Android:更改语言Android N,应用程序实例未更新

Ngo*_*Van 6 android multiple-languages applicationcontext android-7.0-nougat

我以编程方式遵循Android N更改语言,从而在android N及更高版本中更改了我的应用程序的语言。但是,我仍然对应用程序上下文实例有疑问。

在我的应用程序类中:

private static Application mInstance;

public static Context getApplication() {
    return mInstance;
}

@Override
public void onCreate() {
    super.onCreate();

    mInstance = this;
}
Run Code Online (Sandbox Code Playgroud)

语言已更改,但是从应用程序上下文获取的资源未更改。例如:

MyApplication.getApplication().getResources().getString(stringId);  
Run Code Online (Sandbox Code Playgroud)

用返回错误的语言字符串。

在这种情况下可以更新应用程序实例吗?我把这个问题坚持了几个小时。因为MyApplication.getApplication()已在我的应用程序的许多地方使用。因此,我无法转换为Activity上下文。

非常感谢。

小智 0

我的一个应用程序也有同样的问题,因为我确实喜欢我的管理器和实用程序,它们不需要每次都传递上下文。

我的解决方案涉及两个独立的上下文,一个应用程序上下文和一个区域设置上下文。这并不能解决所有问题,例如使用正确的样式填充正确的区域设置,为此您需要使用活动上下文。但是,如果您需要根据当前区域设置从资源中获取正确的字符串或图像,那么此解决方案将起作用。

public class MainApplication extends Application {
    private static Context applicationContext;
    private static Context localeContext;

    public static Context getAppContext() {
        return applicationContext;
    }

    public static Context getLocaleContext() {
        return localeContext;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        setTheme(R.style.AppTheme);
        applicationContext = getApplicationContext();
        updateLocaleContext();
    }

    public static void updateLocaleContext() {
        localeContext = LocaleHelper.wrapContext(applicationContext);
    }
}
Run Code Online (Sandbox Code Playgroud)

LocaleHelper.wrapContext 应该使用类似的解决方案,作为 Android N 上接受的答案以编程方式更改语言,并且所有活动都需要实现 AttachBaseContext。每次语言更改时都需要调用 MainApplication.updateLocaleContext。注意:localeContext不保留onCreate函数中设置的样式

现在,您可以将 MainApplication.getLocaleContext() 用于依赖于正确区域设置的资源,同时使用 MainApplication.getAppContext() 来扩展不依赖于区域设置的视图。注意:您也可以将 localeContext 放在 LocaleHelper 中以减少耦合