onCheckedChangedListener被触发但不会将数据保存到SharedPreferences(Android)
我有一个设置页面,用户可以在该页面中为我的应用程序选择倒数计时器的时间。它有3个单选按钮,我想要发生的是当用户点击其中一个按钮时,一个int值将被保存到SharedPreferences中作为另一个活动中的定时器的“时间”参数。onCheckedChangedListener被触发但不会将数据保存到SharedPreferences(Android)
单选按钮的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编程非常陌生,所以请在你的解释中温和一些。谢谢。
所有你需要添加if (isChecked)
您onCheckedChanged
功能的第一。此外首选项的初始化想出门开关,让你函数将是这样的:
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
prefs = PreferenceManager.getDefaultSharedPreferences(this);
switch (buttonView.getId()) {
....
}
}
}
的问题是,其他单选按钮的onCheckedChanged
可能会覆盖在首选项的值。
在我的XML文件中,我有这行android:checked =“true”。这是我想到的问题。它覆盖了偏好中的价值。谢谢! – BBrain
宁可呼叫editor.commit();
您editor.putInt
commit()
写入数据后同步(阻塞线程从它的调用)。然后它会通知您操作的成功。
apply()
安排要写入的数据异步。它没有通知您操作的成功。
您只在第一个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;
我在第一个switch语句中初始化它,因为我正在测试该单选按钮。我做了外部初始化,但同样的事情发生 – BBrain
使用意图在活动之间传递数据并且不要忘记调用commit()来保存对首选项的更改 – Nanoc