Android onRotate语言环境消失了

时间:2013-11-15 12:31:35

标签: android locale

我有两项活动:

- >主要活动

- >配置活动

从'MainActivity'我打开'ConfigurationActivity'。对于小型设备,此“ConfigurationActivity”显示在水平屏幕上。

点击“保存按钮”后,我重新打开“MainActivity”。由于'ConfigurationActivity'在水平屏幕中显示,'MainActivity'也显示在水平屏幕中。

如果我将手机翻转到垂直屏幕,我将丢失我的语言环境配置。

这是我设置区域设置的代码:

Locale locale = new Locale(lang); 
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = locale;
res.updateConfiguration(conf, dm);
Intent refresh = new Intent(this, MainActivity.class);
refresh.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(refresh);
finish();

我试图在Manifest中强制使用'MainActivity',语言环境和方向而没有成功。

<activity
    android:name="main.myproject.MainActivity"
    android:label="@string/title_activity_mainactivity"
    android:windowSoftInputMode="stateHidden"
    android:configChanges="locale|orientation" >
</activity>

可以是将区域设置保存到首选项中的解决方案,然后在'MainActivity'中调用该首选项的方法Create()吗?

感谢。

修改(1):

以下代码不起作用。它继续,每当我将屏幕从水平翻转到垂直时,它就会自动更改应用程序语言。我只有两种语言,母语是:葡萄牙语,第二种是英语。

在'ConfigurationActivity'中,我将代码更改为:

public void setLocale(String lang) { 
    Locale locale = new Locale(lang); 
    Resources res = getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    Configuration conf = res.getConfiguration();
    conf.locale = locale;
    res.updateConfiguration(conf, dm);

    SharedPreferences sPrefs = getSharedPreferences("localePref", 0);
    sPrefs.edit().putString("lang", lang).commit();

    Intent refresh = new Intent(this, MainActivity.class);
    refresh.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(refresh);
    finish();
}

在'MainActivity'中,我创建了一种调用该语言的方法。

private void load_language(){
    SharedPreferences sPrefs = getSharedPreferences("localePref", 0);
    String lang = sPrefs.getString("lang", "pt_PT");

    Locale locale = new Locale(lang); 
    Resources res = getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    Configuration conf = res.getConfiguration();
    conf.locale = locale;
    res.updateConfiguration(conf, dm);
}

我'覆盖'函数onCreate()和onConfigurationChanged():

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_MainActivity);
    load_language();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    setContentView(R.layout.activity_MainActivity);
    load_language();
}

我'log.e'来自首选项的值,值是正确的。 我做错了什么?

1 个答案:

答案 0 :(得分:1)

方向改变重新构建整个活动。这样,所有变量及其值都会被重新创建。因此,您将其保存在本地首选项中的想法可能是最佳解决方案。

保存:

SharedPreferences sPrefs = getSharedPreferences("myAppsPreferences", 0);
sPrefs.edit().putBoolean("myKeyHere", value).commit();

装载:

SharedPreferences sPrefs = getSharedPreferences("myAppsPreferences", 0);
Boolean bCheck = sPrefs.getBoolean("MyKeyHere", defaultValue);

适用于其他原始数据类型!