Я работаю над проектом 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 всегда извлекают значение по умолчанию, независимо от того, нажата кнопка или нет.




Ваш context.getSharedPreferences("PreferencesFileName",MODE_PRIVATE) должен быть одинаковым даже при использовании activity?.getPreferences("PreferencesFileName",MODE_PRIVATE). В вашем коде это не так.
Плюс простое предложение, потому что я не уверен, что вы это понимаете. bla — это ключ для вашего значения boolean, а не имени файла настроек. Я имею в виду, что это может быть, но лучше расстаться.
удалите и переустановите приложение. а сейчас еще раз проверю что не так
И я до сих пор считаю, что проблема в этом. Ваш context.getSharedPreferences("PreferencesFileName",MODE_PRIVATE) должен быть таким же, даже при использовании activity?.getPreferences("PreferencesFileName",MODE_PRIVATE). В вашем коде это не так
Да, вы правы, я должен передать имя файла в обе функции. getPreferences не принимал строковый параметр, поэтому мне пришлось изменить его на getSharedPReferences. Теперь работает отлично.
Вы могу используете одно и то же ключевое слово как для имени файла, так и для ключа. Правильное объяснение содержится в ответе @earthw0rmjim.
Метод 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, и теперь информация успешно передается.
Я изменил ключевое слово имени файла «SharedPreferences» на другое, но та же проблема осталась.