不会从SharedPreferences加载值 - 在计算中使用它们时,它们看起来是空白的

时间:2012-04-23 11:42:19

标签: java android sharedpreferences

在我的应用中测试某个活动时,我发现它没有使用我使用PreferenceActivity设置的值。

我可以确认这些值是在PrefsActivity中正确设置的(至少是“本地”),因为每次打开它时,设置都与上次关闭时的设置完全一样......

我是否必须在我的PreferenceActivity中指定要将设置存储到哪个首选项文件中,或者我用于导入这些值以在我的活动中使用的方法是否存在问题? 感觉就像我在网上搜索过一样,没有找到对这个问题的明确答案......

这是我的活动应该加载首选项的地方,看起来是否合适? 我知道这是唯一缺少的,因为当我在调试模式下运行并手动输入要使用的值时,计算工作正常......

public void OnStart() {
    // Loads the values for the calculator to use
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
       bodymass = settings.getInt(getString(R.string.pref_key_user_mass).toString(), 0);
       gender = settings.getString(getString(R.string.pref_key_user_gender).toString(), "");

此外,以下代码是否适合您? (如果有人告诉我如何制作一个'if'语句,同时比较几个变量,我也将不胜感激 - 例如if(三个字段中的一个是空的){做某事}}

    //Checks defined user gender and sets value to be used by calc accordingly
    if (gender == "male") {
        genderValue = 0.7;
    }
    else if (gender == "female") {
        genderValue = 0.6;
    }
    else if (gender == "") {
        settingsAlert();
    }

它似乎永远不会触发settingsAlert() - 函数,即使所有应用程序数据都被擦除(它应该生成警报消息,提示用户在使用之前设置首选项,但没有任何反应)

这是应该产生警报的代码:

public void settingsAlert() {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("@string/dialog_setPrefs_text")
           .setCancelable(false)
           .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                   Intent gotoSettings = new Intent(ActivityCalc.this, ActivitySettings.class); 
                   startActivity(gotoSettings);
               }
           })
           .setNegativeButton("No", new DialogInterface.OnClickListener() {
               public void onClick(DialogInterface dialog, int id) {
                    finish();
               }
           })
           .create();
}

- UPDATE -

我现在设法得到了它应该产生的警告对话框,我想我会发布使其成为可能的代码行,所以其他有同样问题的人可以观看和学习...... :)

问题似乎是警报确实是正确创建的,但从未实际调用过显示 - 因此,一旦我在最后一行.show()之后添加了少量.create(),一切都完美无缺。 / p>

或者,您可以将其定义为AlertDialog对象,只要您愿意就可以调用它:

    AlertDialog alert = builder.create();
    alert.show();

我在这里发布了PreferenceActivity类的内容供您查看

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // This line will import the preferences to display in the settings activity
    addPreferencesFromResource(R.xml.settings);
}

要了解如何构建首选项资源文件,请查看this article

我不再包含用于指定要使用的共享首选项名称的字符串,因为我更改了get-method以使用DefaultSharedPreferences:

SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(getBaseContext());

我现在只定义并初始化了其余活动所需的持久变量:

private double genderValue = 0;
private String gender = "";
private int bodymass = 0;

应用程序现在的工作原理与应该完全一样 - 不会崩溃,并正确加载PreferenceActivity中设置的首选项。

1 个答案:

答案 0 :(得分:1)

您需要为IF-ELSE句子使用equals

if (gender.equals("male")) { //equals
    genderValue = 0.7;
}
else if (gender.equalsIgnoreCase("female")) { //Here the equalsIgnorecase one
    genderValue = 0.6;
}
else if (gender == "") {
    settingsAlert();
} else {
    settingsAlert();  //Probably it always comes here.
}

另一件事......你用'commit'正确保存了首选项吗?

  settings.edit().putString(getString(R.string.pref_key_user_gender).toString(), gender).commit();

- 第3次评论后---

没试过。每个一个工作正常。但是如果你检查'duanhong169'评论,那么下面有2个putString和最后一个提交,所以..试一试:) 无论如何你可以这样做:

SharedPreferences.Editor editor = settings.edit();
editor.putString("gender", genderValue);
editor.putInt("bodymass", bodymassValue);
editor.commit();

回答你的另一个问题..你需要'编辑'来保存一个偏好,它是如何工作的。你可以在onpause,onrestart或者你需要的数据之后(在方法内)使用它。 即如果您需要登录数据,一旦您检查登录是正确的,并且如果您存储了不同的登录传递值(不同的用户),您可以edit.putString将新值保存在onResult确认中。

你可以做的更好的事情是尝试使用不同的方法保存到不同标签的prefferences,然后创建一个Log并从每个标签中执行getString(),这样你就可以知道哪个有效,然后你可以选择更好的/更容易你的情况。

- 更新2 -

据我所知..(我从来没有尝试过,和你一样,我是android的新手)你的preferences.xml应放在 res / xml 然后:

public class PreferencesFromXml extends PreferenceActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Load the preferences from an XML resource
        addPreferencesFromResource(R.xml.preferences);
    }
}

并获取数据:

PreferenceManager.setDefaultValues(this, R.xml.prefer, false);
SharedPreferences p = PreferenceManager.getDefaultSharedPreferences(this); 
p.getString("key", "value_default")