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

标签 java android sharedpreferences

在我的应用程序中测试 Activity 时,我发现它没有使用我使用 PreferenceActivity 设置的值。

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

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

这是我的 Activity 应该加载首选项的地方,它看起来正确吗? 我知道这是唯一缺少的东西,因为当我在 Debug模式下运行它并手动输入要使用的值时,计算工作正常......

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

--更新--

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

问题似乎是警报确实创建正确,但从未真正调用显示 - 因此一旦我在 .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);
}

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

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

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

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

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

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

最佳答案

你需要在 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.
}

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

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

--第三条评论后---

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

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

回答你的其他问题.. 你需要“编辑”来保存偏好,它是如何工作的。您可以在 onpause、onrestart 或刚获得所需数据后(在方法内)使用它。 也就是说,如果您需要登录数据,一旦您检查登录是否正确,并且如果您存储了不同的登录密码值(不同的用户),您可以编辑 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")

关于java - 不会从 SharedPreferences 加载值 - 在计算中使用它们时,它们看起来是空白的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10279856/

相关文章:

java - 如何从 thymeleaf 中的属性文件中读取值

java - 如何在 Struts 2 中验证失败时返回自定义响应

Java Date - 插入数据库

android - 在 Sharedpreferences 中将 stored int 转换为 long

android - 在 fragment 中设置共享首选项,在主要 Activity Android 中访问

java - javafx将无法找到我的.wav或.mp3文件

android - 如何使用 ia92 wmqtt.jar 设置 Android MQTT 项目?

android - 将libgdx项目导入Eclipse Juno报错Cannot find .apk

java - Firebase 未正确发送 otp

android - 共享偏好内容提供者