getResources().getString() 在方向更改后不起作用



我的安卓应用程序是双语的。所以我有 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());

(我知道这个答案已经很晚了,我希望它能帮助到那里的人,干杯!

最新更新