区域设置:未调用onConfigurationChanged

时间:2013-08-21 18:48:26

标签: android android-fragments android-manifest locale

我希望我的语言动态更改,我正在尝试使用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文本和所有其他文本。我有一个单独的法语字符串文件。

任何帮助都会很棒。

2 个答案:

答案 0 :(得分:7)

你必须定义android:configChanges =“layoutDirection | locale”才能调用onConfigurationChanged()。

答案 1 :(得分:4)

好的,我已经对此进行了一些调查。

我不确定,为什么onConfigurationChanged方法没有被调用,所以我希望有人可以启发我们。

在我的搜索中,我偶然发现了tutorial,它实际上通过更改配置来更改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);
}

这就是&#34;魔术&#34;发生;在您更改了区域设置后,您需要重新加载资源,因为您告诉Android您想要自己处理某些配置,您需要通过再次设置UI项目文本来专门重新加载所有文本。

完成此操作后,应用程序将加载特定区域设置文件夹中的字符串。

Activity的{​​{1}}说法可以找到Android行为方式的答案:

  

[...]

     

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

编写教程的人非常友好地将整个教程项目添加为下载,所以我建议你去看看它是如何工作的,因为它正在工作;-)你可以取消注释onConfigurationChanged方法,因为它似乎没有做任何事情。

希望这有帮助。