当方向发生变化时,为什么在PreferenceActivity上覆盖区域设置?

时间:2013-11-12 02:12:33

标签: android localization preferenceactivity

我有一个应用程序,用户可以在其中更改其语言。

一切正常,只需在MainActivity.onCreate()上使用此代码:

String lang = PreferenceManager.getDefaultSharedPreferences(this).getString("languagePref", "default");
    Configuration config = getResources().getConfiguration();
    if( lang.equals("default") ) lang = Locale.getDefault().getLanguage();
    config.locale = new Locale(lang);
    getResources().updateConfiguration(config, getResources().getDisplayMetrics());

当我重新启动应用程序或浏览活动时,它仍然使用正确的语言。

唯一的问题是在PreferenceActivity屏幕上。当方向更改时,PreferenceActivity标题(仅限它)将更改为默认设备语言。

仍然可以正确检查首选项,如果我返回(关闭PreferenceActivity),应用程序仍然使用正确的语言,但在重新启动应用程序之前,PreferenceActivity仍然存在错误。

我尝试在PreferenceActivity.onCreate()上强制执行上面的代码,而且调试似乎没问题,PrefenceActivity Title仍然存在错误。

这是我的PrefenceActivity代码:

public class PreferencesActivity extends PreferenceActivity {

    @SuppressWarnings("deprecation")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
    }
}

任何其他活动都不会发生此行为:/

无法锁定屏幕方向。

有什么想法吗?

感谢。

4 个答案:

答案 0 :(得分:3)

好的,这为我修好了。

@Override
protected void onSaveInstanceState(Bundle outState) {
    String lang = PreferenceManager.getDefaultSharedPreferences(this).getString("languagePref", "default");
    Configuration config = getResources().getConfiguration();
    if( lang.equals("default") ) lang = Locale.getDefault().getLanguage();
    config.locale = new Locale(lang);
    getResources().updateConfiguration(config, getResources().getDisplayMetrics());
    super.onSaveInstanceState(outState);
}

答案 1 :(得分:1)

我使用onConfigurationChanged()解决了这个问题。 在这种方法中,我在Configuration对象中再次保存首选语言。

答案 2 :(得分:0)

当方向发生变化时,会调用OnCreate活动方法,因此您的代码会再次设置某些属性,查看on oncreate方法或锁定屏幕方向。

答案 3 :(得分:-1)

您可以使用

将屏幕方向锁定为您的活动
android:screenOrientation="portrait"

android:screenOrientation="landscape"