我的应用程序由一个活动组成。它具有导航抽屉,该抽屉会改变活动中的碎片。NAV抽屉项目之一是设置屏幕,它是Androidx首选项片段,并继承PreferenceFragmentCompat
。应用使用MVVM模式
在我的其他片段视图模型中,我调用存储库的方法,该方法从Internet获取数据,然后使用房间DB在本地保存并返回LiveData<List<MyData>>
用于显示片段的UI。
现在我想要这种行为:默认情况下,仅从本地数据库获取数据,如果偏好有更改,则从Internet获取数据并在本地保存。
那么,我应该从pref的变化中听到哪里?我认为也许是主要的活动,但是其他碎片将如何了解这一变化?
更新1 我有四个碎片:过去,现在,未来和设置。每当前三个片段打开时,我都想知道偏好是否已更改。
更新一个问题更新更新:如果用户只能从设置片段中更新偏好,然后单击说明以后的片段,而不是将来fragments onstart onstart onstart onstart onstart onstart onstart onstart onstart onstart onstart onsstart onsstart onsstart onsstart onsstart onsstart onsstart ock on onsstart onsstart onsstart onsstart onsstart onsstart onsstart onsstart ock on onsstart onsstart onsstart onsstart onsstart onsstart on一。您必须维护以前的值。
拳头方式是在您的活动/片段中实现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#onsharedprefreferencechangelistener
更新:要在活动或片段中进行适当的生命周期管理,您应该在onResume((和onpause((和onpause((回调中注册并注册此侦听器,如下所示:
第二路实现此目的是使用本地广播。每当您更新共享首选项时,请发布本地广播。
请参考广播。
https://developer.android.com/guide/components/broadcasts
创建一个像fromInternet这样的livedata字段,在您的mainviewModel中,通知其设置在您的prefereferferfragmentCompat中更改:
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)
});
我省略了一些代码以使答案简单。您可以轻松完成它们。