在 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 中冷启动应用程序后:
- 打开 MainActivity, onCreate muteSound = false
- 点击设置按钮,设置 onCreate 列出 muteSound = false
- 我选中复选框 将其设置为 muteSounds = true
- 我在“设置”中点击 return 按钮 return 到 MainActivity
- MainActivity onCreate muteSound = true
- 点击设置按钮,设置 onCreate 列出 muteSound = false
- 并且复选框未选中 - 因为 muteSound = false
我不明白为什么设置不固定。当我检查以将 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);
}
});
我正在构建我的第一个 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 中冷启动应用程序后:
- 打开 MainActivity, onCreate muteSound = false
- 点击设置按钮,设置 onCreate 列出 muteSound = false
- 我选中复选框 将其设置为 muteSounds = true
- 我在“设置”中点击 return 按钮 return 到 MainActivity
- MainActivity onCreate muteSound = true
- 点击设置按钮,设置 onCreate 列出 muteSound = false
- 并且复选框未选中 - 因为 muteSound = false
我不明白为什么设置不固定。当我检查以将 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);
}
});