onCheckedChangedListener被触发但未将数据保存到SharedPreferences(Android)

时间:2015-11-05 14:36:51

标签: android

我有一个设置页面,用户可以在我的应用中选择倒数计时器的时间。它有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编程的新手,所以请温柔地解释。谢谢。

3 个答案:

答案 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}}可能会覆盖偏好中的值。