在 Android 具有共享首选项的应用程序中静音不起作用

Muting Sounds in Android App with Shared Preferences Not Working

我正在构建我的第一个 Android 应用程序,对于我缺乏专业知识,请提前致歉。到目前为止,我已经在这个问题上讨论了 2 天。当我通过共享首选项在我的设置 Activity 中将声音设置为静音时,该设置不会 'stick'。这是我的 Main Activity:

中的代码
SharedPreferences settingsSP;
boolean muteSound;

然后在onCreate中:

settingsSP = getApplicationContext().getSharedPreferences("PlayerPreferences", Context.MODE_PRIVATE);
muteSound = settingsSP.getBoolean("muteSound", false);

然后我显然使用 muteSound 变量来确定是否在 MainActivity 中播放声音。现在,当我进入设置 activity 时,我有这个代码:

SharedPreferences settingsSP;
boolean muteSound;

然后在 onCreate 中我有这个:

settingsSP = getApplicationContext().getSharedPreferences("PlayerPreferences", Context.MODE_PRIVATE);


if (muteSound) {
      activitySettingsBinding.displayMuteCheckBox.setChecked(true);      
} else {
      activitySettingsBinding.displayMuteCheckBox.setChecked(false);     
}


activitySettingsBinding.displayMuteCheckBox.setOnClickListener(v -> {

    if (activitySettingsBinding.displayMuteCheckBox.isChecked()) {

        muteSound = true;

        SharedPreferences.Editor editor = settingsSP.edit();
        editor.putBoolean("muteSound", muteSound);
        editor.apply();

    } else {

        muteSound = false;

        SharedPreferences.Editor editor = settingsSP.edit();
        editor.putBoolean("muteSound", muteSound);
        editor.apply();

        soundPool.play(bubble, 1, 1, 1, 0, 1);

}

xml代码:

<CheckBox
                    android:id="@+id/displayMuteCheckBox"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="40dp"
                    android:gravity="center_vertical"
                    android:layoutDirection="rtl"
                    android:paddingLeft="40dp"
                    android:paddingTop="16dp"
                    android:paddingBottom="16dp"
                    android:text="Mute Sound"
                    android:textColor="#FFFFFF"
                    android:textSize="20sp"
                    android:textStyle="bold"
                    android:theme="@style/CheckBoxStyle" />

我在整个代码中放置了一些 log.d 标记,以便观察发生了什么。例如,在我在 Android Studio 中冷启动应用程序后:

我不明白为什么设置不固定。当我检查以将 muteSound 设置为 true 时,当我 return 到设置 Activity 时,该设置会丢失。我搜索了代码,看看我是否在其他地方意外设置了 muteSound = true,但是在搜索用法时我没有找到任何。我关于 sharePreferences 的假设是否不正确。它似乎没有保留设置。或者我是否错误地使用了复选框,也许我应该在这里使用另一种类型的按钮。我想使用复选框来控制 MainActivity 和其他应用程序活动中分数、时间和其他项目的显示,但如果我无法理解我的知识差距,我将无法做到至。我做错了什么?

对于 displayMuteCheckBox,使用 setOnCheckedChangeListener 而不是 setOnClickListener 并使用 settingsSP 变量将值存储在 SharedPreferences 中而不是创建 SharedPreferences.Editor 的新对象:

activitySettingsBinding.displayMuteCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            settingsSP.edit().putBoolean("muteSound", isChecked).apply();

            if (isChecked)
                soundPool.play(bubble, 1, 1, 1, 0, 1);
        }
    });