具有共享首选项的LiveData [英] LiveData with shared preferences
问题描述
我有一个设置屏幕,在其中设置一些值.当我设置这些值时,它将保存在共享首选项中,而这些值在我的系统中是必需的 向网络api调用请求作为参数.
I have a settings screen where I am setting some values. When I set those values it gets saved in shared preferences and these values are needed in my request to the network api call as parameters.
现在,我可以在活动中使用侦听器来共享首选项,然后进行api调用并获取新数据,但是我想将其与LiveData一起使用.
Now I can use a listener for shared preferences in my activity then make an api call and get fresh data, but I want to use this with LiveData.
如何使用LiveData监听共享首选项中的更改,然后使用新参数进行网络呼叫.
How can I listen for changes in the shared preferences using LiveData and then make the network call using the new parameters.
推荐答案
Java代码由<一个href ="https://stackoverflow.com/users/1203043/idish">想法,尽管他在这里发表了评论,但不确定为什么他没有将其添加为答案.
Java Code by Idish, though he commented here, but not sure, why he didn't add it as answer.
在下面粘贴相同的代码:
Pasting the same code below:
public abstract class SharedPreferenceLiveData<T> extends LiveData<T> {
SharedPreferences sharedPrefs;
String key;
public T defValue;
public SharedPreferenceLiveData(SharedPreferences prefs, String key, T defValue) {
this.sharedPrefs = prefs;
this.key = key;
this.defValue = defValue;
}
private SharedPreferences.OnSharedPreferenceChangeListener preferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (SharedPreferenceLiveData.this.key.equals(key)) {
setValue(getValueFromPreferences(key, defValue));
}
}
};
abstract T getValueFromPreferences(String key, T defValue);
@Override
protected void onActive() {
super.onActive();
setValue(getValueFromPreferences(key, defValue));
sharedPrefs.registerOnSharedPreferenceChangeListener(preferenceChangeListener);
}
@Override
protected void onInactive() {
sharedPrefs.unregisterOnSharedPreferenceChangeListener(preferenceChangeListener);
super.onInactive();
}
public SharedPreferenceLiveData<Boolean> getBooleanLiveData(String key, Boolean defaultValue) {
return new SharedPreferenceBooleanLiveData(sharedPrefs,key, defaultValue);
}
}
SharedPreferenceBooleanLiveData类
SharedPreferenceBooleanLiveData class
public class SharedPreferenceBooleanLiveData extends SharedPreferenceLiveData<Boolean>{
public SharedPreferenceBooleanLiveData(SharedPreferences prefs, String key, Boolean defValue) {
super(prefs, key, defValue);
}
@Override
Boolean getValueFromPreferences(String key, Boolean defValue) {
return sharedPrefs.getBoolean(key, defValue);
}
}
像在链接:
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferenceStringLiveData sharedPreferenceStringLiveData = new SharedPreferenceStringLiveData(preferences, "cid", "");
sharedPreferenceStringLiveData.getStringLiveData("cid", "").observe(this, cid -> {
Toast.makeText(this, "Change in CID "+cid, Toast.LENGTH_SHORT).show();
});
再次使用Preference Helper类,可以按以下方式调用该类: 只是一个示例:
Again if using a Preference Helper class, the class can be called as below: Just a sample:
public class PreferenceManager {
private SharedPreferenceBooleanLiveData sharedPreferenceLiveData;
public SharedPreferenceBooleanLiveData getSharedPrefs(){
return sharedPreferenceLiveData;
}
public void setSharedPreferences(String key, boolean value) {
SharedPreferences userDetails = context.getSharedPreferences(APP_PREFERENCE,
Context.MODE_PRIVATE);
SharedPreferences.Editor editor = userDetails.edit();
editor.putBoolean(key, value);
editor.apply();
sharedPreferenceLiveData = new SharedPreferenceBooleanLiveData(userDetails,key,value);
}
}
然后在活动类中按以下方式调用它: 创建一个对象:
And in the activity class call it as below: Create an object:
SharedPreferenceBooleanLiveData sharedPreferenceLiveData;
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
sharedPreferenceLiveData = preferenceManager.getSharedPrefs();
}
并观察如下:
sharedPreferenceLiveData.getBooleanLiveData(PreferenceKey.KEY_LOCATION_PERMISSION,false).observe(this,check->{
if(check){
setPermissionGranted(check);
}
});
这篇关于具有共享首选项的LiveData的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!