слушать изменения в предпочтениях в простом фрагменте с моделью представления - PullRequest
0 голосов
/ 08 мая 2019

Мое приложение состоит из одного действия.У этого есть навигационный ящик, который изменяет фрагмент в деятельности.Одним из элементов панели навигации является экран настроек, который является фрагментом настройки androidx и наследует PreferenceFragmentCompat.Приложение использует шаблон MVVM

В моей модели представления других фрагментов я вызываю метод репозитория, который получает данные из Интернета, а затем сохраняет локально, используя room db, и возвращает LiveData<List<MyData>>, который используется для отображения пользовательского интерфейса фрагмента.

Теперь мне нужно такое поведение: по умолчанию извлекать данные только из локальной базы данных и, если есть изменения в предпочтениях, извлекать данные из Интернета и также сохранять локально.

, так где я должен слушать измененияв префе?Я думаю, что возможно MainActivity, но как другие фрагменты узнают об этом изменении?

ОБНОВЛЕНИЕ 1 У меня есть четыре фрагмента: прошлое, настоящее, будущее и настройки.всякий раз, когда открывается любой из первых трех фрагментов, я хочу знать, изменилось ли предпочтение или нет.

Ответы [ 2 ]

1 голос
/ 08 мая 2019

Обновить после обновления вопроса: если пользователь может обновить настройки только из фрагмента «Настройки», а затем нажать, например, на «будущий фрагмент», в будущих фрагментах при запуске проверьте, изменилось ли значение из предыдущего. Вы должны сохранить предыдущее значение.

Первый способ - реализовать OnSharedPreferenceChangeListener в вашей деятельности / фрагменте.

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, 
 String key) {
   if (key.equals(“signature”)) {
    Log.i(TAG, “Preference value was updated to: “ + s 
 haredPreferences.getString(key, ""));
  }
}

См. Это для более https://developer.android.com/guide/topics/ui/settings/use-saved-values#onsharedpreferencechangelistener

Обновление: для правильного управления жизненным циклом в вашей Деятельности или Фрагменте вы должны зарегистрировать и отменить регистрацию этого слушателя в обратных вызовах onResume () и onPause (), как показано ниже:

Второй способ для достижения этой цели - использование местных трансляций. Когда вы обновляете общие настройки, публикуйте локальную трансляцию.

См. Это для трансляций.

https://developer.android.com/guide/components/broadcasts

0 голосов
/ 08 мая 2019

Создайте поле LiveData, например, из Интернета, в вашей MainViewModel, сообщите об этом, изменив настройку в вашем PreferenceFragmentCompat:

fromInternetPreference.setOnPreferenceChangeListener((p,value)->{
    ViewModelProviders.of(getActivity()).get(MainViewModel.class).notifyFromInternet(value);
    return true;
});

В других фрагментах просто соблюдайте isFromInternet LiveData:

ViewModelProviders.of(getActivity()).get(MainViewModel.class)
        .getFromInternet().observe(this, { value ->
             //do your work,may be currentFragmentViewModel.setFromInternet(value)
        });

Я упустил некоторый код для упрощения ответа. Вы можете легко их заполнить.

...