我关注 Android N change language programmatically在 android N 及更高版本中更改我的应用程序的语言。但是,我仍然遇到应用程序上下文实例的问题。
在我的应用程序类中:
private static Application mInstance;
public static Context getApplication() {
return mInstance;
}
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
}
语言改变了,但是从应用程序上下文中获取的资源没有改变。例如:
MyApplication.getApplication().getResources().getString(stringId);
返回错误的语言字符串。
我可以在这种情况下更新应用程序实例吗?我坚持这个问题几个小时。因为 MyApplication.getApplication() 在我的应用程序的许多地方都使用过。所以我无法转换为 Activity 上下文。
非常感谢。
最佳答案
我的一个应用程序也有同样的问题,因为我喜欢我的管理器和实用程序,它们不需要每次都传递上下文。
我的解决方案涉及两个独立的上下文,一个应用程序上下文和一个语言环境上下文。这并不能解决所有问题,例如使用正确的样式使用正确的语言环境进行膨胀,为此您需要使用 Activity 上下文。但是,如果您需要根据当前语言环境从资源中获取正确的字符串或图像,则此解决方案将起作用。
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);
}
}
LocaleHelper.wrapContext 应该使用与 Android N change language programmatically 上接受的答案类似的解决方案并且所有 Activity 都需要实现 attachBaseContext。每次语言更改时,都需要调用 MainApplication.updateLocaleContext。 注意:localeContext不保留onCreate函数中设置的样式
现在,您可以将 MainApplication.getLocaleContext() 用于依赖于正确语言环境的资源,同时将 MainApplication.getAppContext() 用于例如膨胀不依赖于语言环境的 View 。 注意:您也可以将 localeContext 放在 LocaleHelper 中以减少耦合
关于Android:更改语言 android N,应用程序实例未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47088281/