Java 韩元';t从SharedReferences加载值-在计算中使用这些值时,它们似乎为空

Java 韩元';t从SharedReferences加载值-在计算中使用这些值时,它们似乎为空,java,android,sharedpreferences,Java,Android,Sharedpreferences,在我的应用程序中测试活动时,我发现它没有使用我使用PreferenceActivity设置的值 我可以确认这些值是在PrefsActivity中正确设置的(至少是“本地”),因为每次我打开它时,设置都与上次关闭它时完全相同 我是否必须在我的首选项活动中指定将设置存储到哪个首选项文件中,或者我用于导入这些值以在我的活动中使用的方法有问题? 感觉就像我在网上搜索了所有的东西,却没有找到这个问题的明确答案 这就是我的活动应该加载首选项的地方,它看起来正确吗? 我知道这是唯一缺少的东西,因为当我在调试模

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

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

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

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

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(), "");
另外,您觉得下面的代码正确吗? (如果有人告诉我如何同时比较多个变量的“如果”语句,我也将不胜感激——例如,如果(三分之一的字段为空){do something})

它似乎永远不会触发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()
之后添加了一点
.show()
,一切都很好

或者,您可以将其定义为AlertDialog对象,并随时调用它:

    AlertDialog alert = builder.create();
    alert.show();
我把我的首选活动课程的内容贴在这里让你看

@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);
}
要查看如何构建首选项资源文件,请查看

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

SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
我现在只定义并初始化了在活动的其余部分保持不变所需的变量:

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();
--第三次评论之后---

从未尝试过。一个一个很好。但是如果你查看“段宏169”的评论,下面有两个putString和最后一个committed,所以。。试试看:) 无论如何,你可以做:

SharedPreferences.Editor editor = settings.edit();
editor.putString("gender", genderValue);
editor.putInt("bodymass", bodymassValue);
editor.commit();
回答你的另一个问题。。你需要“编辑”来保存预引用,这就是它的工作原理。您可以在onpause、onrestart或刚获得所需数据(在方法内部)时使用它。 Ie如果需要登录数据,在检查登录是否正确后,如果存储了不同的登录密码值(不同的用户),则可以编辑.putString以将新值保存在onResult confirmation中

您可以做的更好的事情是尝试使用不同的标记保存到预引用的不同方法,然后从每个标记创建日志并执行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")

你需要在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();
--第三次评论之后---

从未尝试过。一个一个很好。但是如果你查看“段宏169”的评论,下面有两个putString和最后一个committed,所以。。试试看:) 无论如何,你可以做:

SharedPreferences.Editor editor = settings.edit();
editor.putString("gender", genderValue);
editor.putInt("bodymass", bodymassValue);
editor.commit();
回答你的另一个问题。。你需要“编辑”来保存预引用,这就是它的工作原理。您可以在onpause、onrestart或刚获得所需数据(在方法内部)时使用它。 Ie如果需要登录数据,在检查登录是否正确后,如果存储了不同的登录密码值(不同的用户),则可以编辑.putString以将新值保存在onResult confirmation中

您可以做的更好的事情是尝试使用不同的标记保存到预引用的不同方法,然后从每个标记创建日志并执行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")

我是否需要提交在PreferenceActivity中所做的更改?我以为框架应该自己处理所有这些。。。(参见上面对段宏169答案的评论)是的,您需要它(您可以在中选中并选择另一个选项,而不是commit()。我想你可以访问这些数据。。选中“确定”,我猜我必须对每个我想保存并可用于其他活动的首选项进行单独设置。edit(),对吗?然后,我是否必须在每次提交后调用commit,或者我是否可以在最后一次提交时“总结”所有内容?“编辑”和“提交”都应该放在“暂停”或“停止”下,否则没关系吗?我已经用我的首选项活动的内容更新了问题-无法让它正常工作。如果你能快速看一下,告诉我应该是什么样子,那就太棒了。很抱歉这么麻烦你,我真的很感谢你花时间帮助一个Java/Android新手-