我的安卓应用程序是双语的。所以我有 2 个 res 文件夹值和值 sw(用于斯瓦希里语(。我在设计和运行时从这个文件中获取字符串值。例如在布局中:
android:hint="@string/Officer"
并在代码中:
getResources().getString(R.string.Officer);
要更改语言环境设置,我有一个函数,我在onCreate((上调用它,如下所示:
public void ChangeLanguage(Context ctx,String Language){
Resources res = ctx.getResources();
DisplayMetrics dm = res.getDisplayMetrics();
android.content.res.Configuration config = res.getConfiguration();
config.locale = new Locale(Language.toLowerCase());
res.updateConfiguration(config, dm);
}
一切正常。只有当我改变方向时,问题才会出现。
例如,在启动时,我将语言设置为斯瓦希里语。所以一切都是斯瓦希里语。现在,如果我将方向从垂直更改为水平或相反。 在布局中设置的文本框提示保留在我期望的斯瓦希里语中。但是getResources((.getString(R.string.Officer(;从默认值文件(英语(中获取值。
有什么建议吗?
android:configChanges="orientation"
设置为您在 Android 清单中的活动.xml
这样做会导致您的活动在更改方向时不会被破坏和重新创建。
具有 android:configChanges
属性的问题在于,这在方向更改后禁止调用 onCreate((。你基本上是在告诉应用程序:"我知道会有方向变化,所以不要重新创建屏幕,我会处理它">
我建议在onConfigurationChanged()
方法中调用您的该函数。请记住,此时任何视图都将为空,因此如果需要它们,则需要获取新的引用。
我的情况与问题中的案例相同,在应用程序中使用英语和斯瓦希里语。这就是我解决它的方式:我创建了一个名为values-sw
的文件夹,然后在该文件夹中创建了一个名为string.xml
的资源文件。这是我所有斯瓦希里语翻译的写作地。我在onCreate中调用以下方法:
public static void setLocale(Context context) {
SharedPreferences sharedPreferences = context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE);
String userLocale = sharedPreferences.getString("userlocale", null); // adapt to your need
if (userLocale != null) {
Locale locale = new Locale(userLocale);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
}
}
不要忘记刷新您的活动以使更改生效:
finish();
startActivity(getIntent());
(我知道这个答案已经很晚了,我希望它能帮助到那里的人,干杯!