在我的应用中测试某个活动时,我发现它没有使用我使用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();
}
我现在设法得到了它应该产生的警告对话框,我想我会发布使其成为可能的代码行,所以其他有同样问题的人可以观看和学习...... :)
问题似乎是警报确实是正确创建的,但从未实际调用过显示 - 因此,一旦我在最后一行.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中设置的首选项。
答案 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")