#android #checkbox #sharedpreferences
Вопрос:
Я создаю свое первое приложение для Android, поэтому заранее приношу извинения за отсутствие у меня опыта. Я занимаюсь этим вопросом уже 2 дня. Когда я отключаю звук в своих настройках с помощью общих настроек, настройка не «прилипает». Вот код из моей основной деятельности:
SharedPreferences settingsSP;
boolean muteSound;
Затем в onCreate:
settingsSP = getApplicationContext().getSharedPreferences("PlayerPreferences", Context.MODE_PRIVATE);
muteSound = settingsSP.getBoolean("muteSound", false);
Затем я, очевидно, использую переменную muteSound, чтобы определить, следует ли воспроизводить звуки в основной активности. Теперь, когда я захожу в раздел Настроек, у меня есть этот код:
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:
- Откройте основную активность, onCreate muteSound = false
- Нажмите кнопку Настройки, и в списке настроек onCreate появится muteSound = false
- Я устанавливаю флажок, чтобы установить его на muteSounds = true
- Я нажимаю кнопку возврата в настройках, чтобы вернуться к основной активности
- Основная активность onCreate muteSound = true
- Нажмите кнопку Настройки, и в списке настроек onCreate появится muteSound = false
- И флажок снят — потому что muteSound = false
Я не могу понять, почему настройки не залипают. Когда я проверил, чтобы установить значение muteSound равным true, эти настройки теряются, когда я возвращаюсь к действию Настройки. Я искал код, чтобы узнать, установил ли я muteSound = true случайно где-нибудь в другом месте, но при поиске использований я ничего не нашел. Является ли мое предположение о sharePreferences неверным. Похоже, что он не содержит настроек. Или, возможно, я неправильно использую флажок, возможно, мне следует использовать здесь другой тип кнопки. Я хотел бы использовать флажки для управления отображением результатов, времени и других элементов в основной активности и во всех других действиях приложения, но если я не смогу устранить этот пробел в своих знаниях, я не смогу этого сделать. Что я делаю неправильно?
Комментарии:
1. Какое это имеет отношение к SQLite?
Ответ №1:
Для displayMuteCheckBox используйте setOnCheckedChangeListener
вместо setOnClickListener
и используйте переменную settingsSP для хранения значения в SharedPreferences вместо создания нового объекта SharedPreferences.Редактор:
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);
}
});
Комментарии:
1. Большое вам спасибо, Зееро0! Я внес несколько изменений, но с вашей помощью мне удалось заставить его работать! Я очень ценю вашу помощь!