Приглушение звуков в приложении для Android с общими настройками Не работает

#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! Я внес несколько изменений, но с вашей помощью мне удалось заставить его работать! Я очень ценю вашу помощь!