我有一个设置页面,用户可以在我的应用中选择倒数计时器的时间。它有3个单选按钮,我想要发生的是当用户点击其中一个时,一个int值被保存到SharedPreferences作为另一个活动中我的计时器的“时间”参数。
单选按钮的onCheckedChangedListener会被触发,但时间值不会保存到SharedPrefs。
以下是我的设置活动的摘录:
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
switch (buttonView.getId()) {
case R.id.thirty:
prefs = PreferenceManager.getDefaultSharedPreferences(this);
editor = prefs.edit();
editor.putInt("time", 30000).apply();
Toast.makeText(this, "h", Toast.LENGTH_SHORT).show();
break;
case R.id.fifty:
editor.putInt("time", 50000);
editor.apply();
break;
case R.id.ninety:
editor.putInt("time", 90000);
editor.apply();
break;
}
}
以下是我(未成功)在另一个活动中检索数据的地方:
mprefs = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
time = mprefs.getInt("time", 50000);
cdTimer = new Timer(time, 1000);
另一件事是,当我为这样的单选按钮设置onClickListener时,而不是onCheckedChanged一切正常
thirty = (RadioButton)findViewById(R.id.thirty);
thirty.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
prefs = PreferenceManager.getDefaultSharedPreferences(Options.this);
editor = prefs.edit();
editor.putInt("time", 30000).apply();
}
});
有人可以解释为什么会这样吗?我是Android编程的新手,所以请温柔地解释。谢谢。
答案 0 :(得分:0)
在 editor.commit();
editor.putInt
commit()
将数据同步写入(阻止其调用的线程)。然后它会通知您操作的成功。
apply()
安排要以异步写入的数据。它没有通知您操作是否成功。
答案 1 :(得分:0)
您只能在第一个switch语句中初始化编辑器,而不是在其他两个语句中初始化。如果我是你,我会在点击监听器之外初始化它,然后它可以在任何地方使用。
case R.id.thirty:
prefs = PreferenceManager.getDefaultSharedPreferences(this);
editor = prefs.edit();
editor.putInt("time", 30000).apply();
Toast.makeText(this, "h", Toast.LENGTH_SHORT).show();
break;
答案 2 :(得分:0)
首先,您需要将onCheckedChanged
添加到@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
prefs = PreferenceManager.getDefaultSharedPreferences(this);
switch (buttonView.getId()) {
....
}
}
}
功能中。 prefs的初始化也想离开开关,所以你的功能看起来像这样:
onCheckedChanged
问题是其他单选按钮{{1}}可能会覆盖偏好中的值。