В какой-то момент я всегда чувствую, что взламываю Android, и это определенно взлом.
Сначала я думал, что проблема, с которой я борюсь, заключается в том, что фреймворк игнорирует мой android: ключ,потому что getKey () возвращает пустую строку, но это не может быть правдой, потому что он получает постоянное значение при запуске PreferenceScreen и сохраняет мои измененные значения в общих настройках при закрытии DialogPreference.
Так что этоКажется, проблема, с которой я борюсь, состоит в том, что платформа считывает постоянные значения предпочтений для внутренних членов, а затем использует внутренние члены, пока поток не выйдет из структуры предпочтений, не обновляя их после закрытия DialogPreference.
Но я наконец-то нашел способ заставить PreferenceScreen обновлять постоянные значения настроек, которые он хранит во внутренних элементах.Хотя на самом деле это не обновление, это взлом.
Так что я просто выбрасываю PreferenceScreen и создаю новый.Я делаю это, добавляя следующий код в мой метод SettingsFragment.onCreate непосредственно перед addPreferencesFromResource (R.xml.preferences).
SharedPreferences.OnSharedPreferenceChangeListener prefListener = (prefs, key) ->
{
setPreferenceScreen(null);
addPreferencesFromResource(R.xml.preferences);
};
PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()).registerOnSharedPreferenceChangeListener(prefListener);
Это, вероятно, плохо.Я проверял его, несколько раз, хотя и не тщательно, и до сих пор не наблюдал каких-либо побочных эффектов.
Так что с этим хаком я теперь могу многократно открывать DialogPreference из PreferenceScreen, сохранять новое значение, затем идтивернитесь к DialogPreference с ранее обновленным значением.
Я не верю, что мой взлом - намеченный способ достижения этого результата, но после нескольких дней поиска в исходном коде и поиске ответов в Google я не нашелчто-нибудь еще.
Я оставляю этот ответ здесь для всех, кто сталкивается с той же проблемой и достаточно смел, чтобы попробовать мой взлом.Я обновлю ответ, если (и, возможно, когда) обнаружу какие-либо проблемы с взломом.
Еще лучше, если кто-то еще сможет предложить предпочтительное решение, указав, что я сделал неправильно, вызвав проблему,пожалуйста, сделай.
РЕДАКТИРОВАТЬ: После столь долгой работы этот хак в итоге сломался, и последовательно.
Но, удаляя хак, я подошел к проблеме со свежимпомните, и, используя тот факт, что я определил, что диалоговое окно получает ключ предпочтения, я использовал это исправление для проблемы, которая работает отлично.
Я добавил эту строку кода в начало onBindDialogView
value = getSharedPreferences().getString(getKey(), "-1");
Что делает вызовы onGetDefaultValue и onSetInitialValue избыточными, но они просто не работают должным образом, по крайней мере, не для меня.
EDIT: omg, я ненавижуthis!
Я не заметил, что во время более раннего рефакторинга была удалена строка кода, которая обновляет внутреннее значение DialogPreference в onDialogClosed.
Обычно это что-то простое, и со всем остальным я проверялЯ пропустил это небольшое изменение.
Я только заметил это во время проверки кода в репозитории, и теперь я чувствую себя глупо.Поэтому в конце не требуется никакого дополнительного кода.