1

在我的应用程序中测试活动时,我发现它没有使用我使用 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”语句同时比较多个变量,我也将不胜感激 - 例如,如果(三个字段中的一个为空){做某事})

    //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();
}

- 更新 -

我现在已经设法让警报对话框按原样生成,我想我会发布实现它的代码行,以便其他有同样问题的人可以观看和学习...... :)

问题似乎是警报确实创建正确,但从未真正调用显示 - 因此,一旦我在最后一行的.show()后面添加了那么一点,一切都运行良好。.create()

或者,您可以将其定义为 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);
}

要了解如何构建首选项资源文件,请查看这篇文章

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

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

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

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

该应用程序现在完全可以正常工作 - 不会崩溃,并且可以正确加载 PreferenceActivity 中设置的首选项。

4

1 回答 1

1

您需要对 IF-ELSE 句子使用等于

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.
}

另一件事..您是否使用“提交”正确保存了首选项?

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

--第三条评论后---

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

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

并回答您的其他问题..您需要“编辑”来保存偏好,它是如何工作的。您可以在 onpause、onrestart 或刚刚获得所需数据之后(在方法内)使用它。即,如果您需要登录数据,一旦您检查登录是否正确,并且如果您存储了不同的登录密码值(不同的用户),您可以 edit.putString 将新值保存在 onResult 确认中。

您可以做的更好的事情是尝试使用不同标签保存到首选项的不同方法,然后创建一个日志并从每个标签执行 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")
于 2012-04-23T12:02:55.030 回答