首页 > 解决方案 > 在具有共享首选项的 Android 应用程序中静音不起作用

问题描述

我正在构建我的第一个 Android 应用程序,因此对于我缺乏专业知识提前道歉。到目前为止,我已经在这个问题上讨论了 2 天。当我通过共享首选项在我的设置活动中将声音设置为静音时,该设置不会“粘住”。这是我的主要活动中的代码:

SharedPreferences settingsSP;
boolean muteSound;

然后在 onCreate 中:

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

然后我显然使用 muteSound 变量来确定是否在 MainActivity 中播放声音。现在,当我进行设置活动时,我有以下代码:

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 时,当我返回设置活动时,该设置会丢失。我已经搜索了代码,看看我是否在其他地方意外设置了 muteSound = true,但是在搜索用法时我没有找到任何东西。我对 sharePreferences 的假设是否不正确。它似乎没有保存设置。或者我是否错误地使用了复选框,也许我应该在这里使用另一种类型的按钮。我想使用复选框来控制 MainActivity 和整个其他应用程序活动中的分数、时间和其他项目的显示,但如果我无法弄清楚我的知识差距,我将无法做到。我做错了什么?

标签: androidcheckboxsharedpreferences

解决方案


对于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);
        }
    });

推荐阅读