SharedPreferences не проходит, чтобы получить сохраненное значение

Я работаю над проектом Android, частично построенным на kotlin и частично на java. Я пытаюсь передать информацию из класса фрагментов kotlin в класс java. Я пришел к выводу, что есть проблема с передачей информации, так как я не получаю нужное значение. После некоторой отладки я увидел, что информация успешно сохраняется, однако при доступе к информации из общих настроек возвращается только значение по умолчанию.

Это код в классе kotlin. Когда кнопка нажата, она меняет значение логической переменной на противоположное, устанавливает для текста кнопки значение true/false и сохраняет значение переменной в общих настройках.

 btnStyle.setOnClickListener() {
            styleHasChanged = !styleHasChanged;

            if (styleHasChanged  == true){
                btnStyle.setText("true")
            }else{
                btnStyle.setText("false")
            }

            val sharedPref : SharedPreferences?= activity?.getPreferences(MODE_PRIVATE);
            sharedPref?.edit()?.putBoolean("bla", styleHasChanged)?.apply()
}

Это класс Java. Общие настройки вызываются внутри функции, которая выбирает путь к файлу на основе полученного значения.

 public static String getHtmlContent(Context context, String htmlContent, Config config) {

    SharedPreferences sharedPreferences = context.getSharedPreferences("bla",MODE_PRIVATE);
    boolean hasStyleChanged = sharedPreferences.getBoolean("bla", false);

    //moj
    String cssPath;


        if (!hasStyleChanged) {
            cssPath = String.format(context.getString(R.string.css_tag), "file:///android_asset/css/Style.css");
        } else {
            cssPath = String.format(context.getString(R.string.css_tag), "file:///android_asset/css/Style2.css");
        }

Вот где возникает проблема. Общие настройки в классе Java всегда извлекают значение по умолчанию, независимо от того, нажата кнопка или нет.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
485
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваш context.getSharedPreferences("PreferencesFileName",MODE_PRIVATE) должен быть одинаковым даже при использовании activity?.getPreferences("PreferencesFileName",MODE_PRIVATE). В вашем коде это не так.

Плюс простое предложение, потому что я не уверен, что вы это понимаете. bla — это ключ для вашего значения boolean, а не имени файла настроек. Я имею в виду, что это может быть, но лучше расстаться.

Я изменил ключевое слово имени файла «SharedPreferences» на другое, но та же проблема осталась.

Vasko Vasilev 20.06.2019 09:41

удалите и переустановите приложение. а сейчас еще раз проверю что не так

coroutineDispatcher 20.06.2019 09:42

И я до сих пор считаю, что проблема в этом. Ваш context.getSharedPreferences("PreferencesFileName",MODE_PRIV‌​ATE) должен быть таким же, даже при использовании activity?.getPreferences("PreferencesFileName",MODE_PRIVATE)‌​. В вашем коде это не так

coroutineDispatcher 20.06.2019 09:46

Да, вы правы, я должен передать имя файла в обе функции. getPreferences не принимал строковый параметр, поэтому мне пришлось изменить его на getSharedPReferences. Теперь работает отлично.

Vasko Vasilev 20.06.2019 09:56

Вы могу используете одно и то же ключевое слово как для имени файла, так и для ключа. Правильное объяснение содержится в ответе @earthw0rmjim.

gpunto 20.06.2019 10:31

Метод getPreferences неявно использует имя класса Activity в качестве имени файла настроек. Передавая "bla" в качестве имени файла getSharedPreferences, вы пытаетесь получить сохраненное значение из другого файла.

Если вы хотите получить доступ к одним и тем же настройкам в своем приложении, то либо используйте getSharedPreferences (как для записи, так и для чтения настройки) с именем файла такой же, или используйте статический метод getDefaultSharedPreferencesPreferenceManager для получения экземпляра SharedPreferences по умолчанию.

Вы должны изменить свой код на что-то вроде этого:

val sharedPref : SharedPreferences? = activity?
        .getSharedPreferences("someFileName", MODE_PRIVATE)
sharedPref?.edit()?.putBoolean("bla", styleHasChanged)?.apply()

И часть Java:

SharedPreferences sharedPreferences = context
        .getSharedPreferences("someFileName", MODE_PRIVATE);
boolean hasStyleChanged = sharedPreferences.getBoolean("bla", false);

Да, это была ошибка. getPreferences был изменен на getSharedPreferences, и теперь информация успешно передается.

Vasko Vasilev 20.06.2019 09:57

Другие вопросы по теме