android - 在具有共享首选项的 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 中冷启动应用程序后:
- 打开 MainActivity,onCreate muteSound = false
- 点击设置按钮和设置 onCreate 列出 muteSound = false
- 我选中复选框以将其设置为 muteSounds = true
- 我点击设置中的返回按钮返回到 MainActivity
- MainActivity onCreate muteSound = true
- 点击设置按钮和设置 onCreate 列出 muteSound = false
- 并且该复选框未选中 - 因为 muteSound = false
我无法弄清楚为什么设置没有坚持。当我检查将 muteSound 设置为 true 时,当我返回设置活动时,该设置会丢失。我已经搜索了代码,看看我是否在其他地方意外设置了 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);
}
});
推荐阅读
- c# - 如何让刚体对象“骑”在一个落下的平台上,同时仍然能够水平移动
- c++ - 为什么指针 p 遇到 0 就终止了?
- javascript - 调整弹性项目的高度
- vector - OpenLayers:用鼠标移动矢量标签
- python - 使用 unicode 时如何在 python 中换行?
- apache-spark - 如何使用列表选择数据集的列
- node.js - Heroku 资产拒绝加载
- python - 如何在 Python 中组合 2 个值以形成一个节点
- intellij-idea - 使用远程服务器设置 IntelliJ 路由
- python - 来自一维数组或列表的热图,x 轴应该是什么?