Android 屏幕旋转后,我的应用程序的语言将发生变化
我已经创建了一个双语(有两种语言)的android应用程序。我已在两个文件中插入了我的资源字符串:Android 屏幕旋转后,我的应用程序的语言将发生变化,android,localization,internationalization,rotation,screen,Android,Localization,Internationalization,Rotation,Screen,我已经创建了一个双语(有两种语言)的android应用程序。我已在两个文件中插入了我的资源字符串: For Persian language (default) values/strings_locale.xml For English language values-en/strings_locale.xml 我在我的第一次启动活动中插入了以下代码: Configuration c = new Configuration(this.getResources().getConfigur
For Persian language (default)
values/strings_locale.xml
For English language
values-en/strings_locale.xml
我在我的第一次启动活动中插入了以下代码:
Configuration c = new Configuration(this.getResources().getConfiguration());
c.locale = new Locale("fa_IR");
this.getResources().updateConfiguration(c, this.getResources().getDisplayMetrics());
因此,在这段代码之后,我的默认语言将是波斯语,所有活动中的所有字符串都正确地以波斯语显示
但问题是,当设备的屏幕旋转时,所有字符串都以英语显示,所有其他活动也会出现这种情况!我必须关闭并重新打开我的应用程序
为什么会发生这种情况,以及我如何解决这个问题?我不太明白您想做什么。但一般来说,你不必管理应用程序的语言。Android将自动选择手机语言(如果可用),在任何其他情况下,都会弹出对话框选择语言
如果您确实希望在代码中设置独立于语言的语言(我不建议这样做),那么您的生命周期可能存在问题,在方向更改后无法再次运行代码。如果您发布更多的代码,我可以帮助您。您可以创建扩展
应用程序的类。在这里,您可以覆盖一个方法,该方法在每次更改配置时都会被调用(例如,当屏幕方向更改时)
比如:
public class MyApplication extends Application {
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
setLocale();
}
private void setLocale() {
Locale locale = new Locale("fa_IR");
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config,
getBaseContext().getResources().getDisplayMetrics());
}
}
别忘了在舱单上声明:
在AndroidManifest.xml中:
<application
android:name="com.blaablaa.bumbam.MyApplication"
...
您可以创建自定义ContextWrapper
public class mContextWrapper extends ContextWrapper {
public mContextWrapper(Context base){
super(base);
}
@SuppressWarnings("deprecation")
public static ContextWrapper wrap(Context context, String language) {
Configuration config = context.getResources().getConfiguration();
Locale sysLocale = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
sysLocale = getSystemLocale(config);
} else {
sysLocale = getSystemLocaleLegacy(config);
}
if (!language.equals("") && !sysLocale.getLanguage().equals(language)) {
Locale locale = new Locale(language);
Locale.setDefault(locale);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
setSystemLocale(config, locale);
} else {
setSystemLocaleLegacy(config, locale);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
context = context.createConfigurationContext(config);
} else {
context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
}
}
return new mContextWrapper(context);
}
@SuppressWarnings("deprecation")
public static Locale getSystemLocaleLegacy(Configuration config){
return config.locale;
}
@TargetApi(Build.VERSION_CODES.N)
public static Locale getSystemLocale(Configuration config){
return config.getLocales().get(0);
}
@SuppressWarnings("deprecation")
public static void setSystemLocaleLegacy(Configuration config, Locale locale){
config.locale = locale;
}
@TargetApi(Build.VERSION_CODES.N)
public static void setSystemLocale(Configuration config, Locale locale){
config.setLocale(locale);
}
}
@Override
protected void attachBaseContext(Context newBase) {
globalClass = (YouAppClass)newBase.getApplicationContext();
//try geting the lang you have setted inside your YouAppClass class
// or you can use shared preferences for it
//pref = PreferenceManager.getDefaultSharedPreferences(newBase)
lang=globalClass .getLang();
super.attachBaseContext(mContextWrapper.wrap(newBase,lang));
}
在您的活动中attachBaseContext附加您的自定义ContextWrapper
public class mContextWrapper extends ContextWrapper {
public mContextWrapper(Context base){
super(base);
}
@SuppressWarnings("deprecation")
public static ContextWrapper wrap(Context context, String language) {
Configuration config = context.getResources().getConfiguration();
Locale sysLocale = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
sysLocale = getSystemLocale(config);
} else {
sysLocale = getSystemLocaleLegacy(config);
}
if (!language.equals("") && !sysLocale.getLanguage().equals(language)) {
Locale locale = new Locale(language);
Locale.setDefault(locale);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
setSystemLocale(config, locale);
} else {
setSystemLocaleLegacy(config, locale);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
context = context.createConfigurationContext(config);
} else {
context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
}
}
return new mContextWrapper(context);
}
@SuppressWarnings("deprecation")
public static Locale getSystemLocaleLegacy(Configuration config){
return config.locale;
}
@TargetApi(Build.VERSION_CODES.N)
public static Locale getSystemLocale(Configuration config){
return config.getLocales().get(0);
}
@SuppressWarnings("deprecation")
public static void setSystemLocaleLegacy(Configuration config, Locale locale){
config.locale = locale;
}
@TargetApi(Build.VERSION_CODES.N)
public static void setSystemLocale(Configuration config, Locale locale){
config.setLocale(locale);
}
}
@Override
protected void attachBaseContext(Context newBase) {
globalClass = (YouAppClass)newBase.getApplicationContext();
//try geting the lang you have setted inside your YouAppClass class
// or you can use shared preferences for it
//pref = PreferenceManager.getDefaultSharedPreferences(newBase)
lang=globalClass .getLang();
super.attachBaseContext(mContextWrapper.wrap(newBase,lang));
}
检查,在旋转后重新创建活动时,您上面的代码可能不会再次运行。。。确保将代码放置在旋转后可以再次处理的位置。这是可能的。如果您在第一个活动中使用我提到的代码,那么您的所有活动都将以该语言显示。你可以测试一下。我的问题是,当我在第三个活动中旋转设备时,我的应用程序的整个活动的语言都变为英语。我知道这是可能的。我只是说你不应该这么做。但是如果你仍然需要我的帮助,那么你需要发布更多的代码。