繁体   English   中英

onCheckedChangedListener被解雇,但未将数据保存到SharedPreferences(Android)

[英]onCheckedChangedListener gets fired but does not save data to SharedPreferences (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编程非常陌生,因此请您多加解释。 谢谢。

最好调用 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;

首先,您需要将if (isChecked)添加到onCheckedChanged函数中。 另外,prefs的初始化也想退出开关,因此您的函数将如下所示:

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    if (isChecked) {
        prefs = PreferenceManager.getDefaultSharedPreferences(this);
        switch (buttonView.getId()) {
            ....
        }
    }
}

问题在于其他onCheckedChanged按钮的onCheckedChanged可能会覆盖首选项中的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM