10

我希望我的语言动态更改,我正在尝试使用 onConfigurationChanged 但它没有被调用。我有一个 MainActivity 来创建我的操作栏和 viewpager。我的其余页面是片段。在我的 SettingsFragment 中,我有一个将语言切换为法语的按钮。

langChange.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View vi) {
            MainActivity main = (MainActivity)getActivity();
            main.langChange();
        }

});

然后在我的 MainActivity 我有

@Override
public void onConfigurationChanged(Configuration newConfig){
    super.onConfigurationChanged(newConfig);
    if (locale != null){
        newConfig.locale = locale;
        Locale.setDefault(locale);
        getBaseContext().getResources().updateConfiguration(newConfig, getBaseContext().getResources().getDisplayMetrics());
    }
}

public void langChange(){
    if(currentLanguage == FRENCH_LANGUAGE){
        locale = new Locale("en");
        Locale.setDefault(locale);
        Configuration c = getBaseContext().getResources().getConfiguration();
        c.locale = locale;
        getBaseContext().getResources().updateConfiguration(c,getBaseContext().getResources().getDisplayMetrics());
        currentLanguage = "English";
    }
    else if(currentLanguage == ENGLISH_LANGUAGE){
        locale = new Locale("fr");
        Locale.setDefault(locale);
        Configuration c = getBaseContext().getResources().getConfiguration();
        c.locale = locale;
        getBaseContext().getResources().updateConfiguration(c,getBaseContext().getResources().getDisplayMetrics());
        currentLanguage = "French";
    }
    actionBar.setSelectedNavigationItem(actionBar.getTabCount() - 1); //This just puts it back to the settings tab
}

onConfigurationChanged没有被调用。在我的清单中,我有:

<activity android:name="MainActivity" android:screenOrientation="portrait" android:configChanges="locale"></activity>

我尝试添加一个或所有这些选项orientation|keyboardHidden|screenSize,但没有成功。

所有这一切的原因是因为我想在单击按钮后更改 actionBar 文本和所有其他文本。我有一个单独的法语字符串文件。

任何帮助都会很棒。

4

2 回答 2

16

您必须定义 android:configChanges="layoutDirection|locale" 才能调用 onConfigurationChanged()。

于 2014-12-25T15:51:47.520 回答
4

好的,我已经对此进行了一些研究。

我不确定,为什么onConfigurationChanged不调用该方法,所以我希望有人能在这方面启发我们。

在我的搜索中,我偶然发现了本教程,它实际上是Locale通过更改配置来更改的。

您的代码实际上看起来很像本教程 ;-)

无论如何,关于教程和代码的重要一点是这个方法:

private void updateTexts() {
    txt_hello.setText(R.string.hello_world);
    btn_en.setText(R.string.btn_en);
    btn_ru.setText(R.string.btn_ru);
    btn_fr.setText(R.string.btn_fr);
    btn_de.setText(R.string.btn_de);
}

这就是“魔法”发生的地方;更改语言环境后,您需要重新加载资源,并且由于您告诉 Android 您想要自己处理一些配置,因此您需要通过再次设置 UI 项文本来专门重新加载所有文本。

完成后,应用程序将从特定的语言环境文件夹加载字符串。

关于 Android 为何如此行事的答案,可以在官方文档中找到这Activity句话:

[...]

这样做是因为任何应用程序资源(包括布局文件)都可以根据任何配置值进行更改。因此,处理配置更改的唯一安全方法是重新检索所有资源,包括布局、可绘制对象和字符串。因为活动必须已经知道如何保存它们的状态并从该状态重新创建自己,所以这是一种使用新配置重新启动活动的便捷方式。

编写教程的人很友好地将整个教程项目添加为下载,所以我建议你去看看它是如何工作的,因为它正在工作;-) 你可以评论这个onConfigurationChanged方法,因为它没有似乎在做什么。

希望这可以帮助。

于 2013-08-22T20:16:53.693 回答