implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.6" // replace with updated version
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.6"// replace with updated version
将下面的代码添加到您的首选项class/utils
private var mPrefs: SharedPreferences =
mContext.getSharedPreferences(AppConstant.PREF_NAME, Context.MODE_PRIVATE)
private val _constSate = MutableStateFlow(mPrefs.getBoolean(IS_NOTIFY,false))
// function for set data to preference and add to Stateflow.
fun setData(isNotify: Boolean){
// mPrefs = instance of your preference
mPrefs.edit().putBoolean(IS_NOTIFY, isNotify).apply()
_constSate.value = isNotify
}
//function for get observer/flow/live boolean value
fun getNotifyFlow() : StateFlow<Boolean> = _constSate
//获取其他类上的观察者/流/实时值,例如MainActivity.class等。
CoroutineScope(Dispatchers.Main).launch{
appPreferences.getNotifyFlow().collect{
if (it){
Log.d("jai","true")
}else{
Log.d("jai","false")
}
}
}
public class SharedPreferencesLiveData extends LiveData<ObservableArrayMap<String, Object>> {
private final SharedPreferences mSharedPreference;
public SharedPreferencesLiveData(final SharedPreferences sharedPreferences) {
super(new ObservableArrayMap<String, Object>() {
@Nullable
@Override
public Object put(String key, Object value) {
final Object lastValue = super.get(key);
if (!Objects.equals(value, lastValue)) {
if (value instanceof Boolean) {
sharedPreferences.edit().putBoolean(key, (Boolean) value).apply();
} else if (value instanceof Float) {
sharedPreferences.edit().putFloat(key, (Float) value).apply();
} else if (value instanceof String) {
sharedPreferences.edit().putString(key, (String) value).apply();
} else if (value instanceof Integer) {
sharedPreferences.edit().putInt(key, (Integer) value).apply();
} else if (value instanceof Long) {
sharedPreferences.edit().putLong(key, (Long) value).apply();
} else if (value instanceof Set) {
sharedPreferences.edit().putStringSet(key, (Set<String>) value).apply();
} else if (value == null) {
sharedPreferences.edit().remove(key).apply();
} else {
throw new IllegalArgumentException("value=" + value + " data type not support");
}
return super.put(key, value);
} else
return lastValue;
}
});
mSharedPreference = sharedPreferences;
}
@Override
protected void onActive() {
super.onActive();
getValue().clear();
getValue().putAll((SimpleArrayMap<? extends String, ?>) new ArrayMap<String, Object>() {{
putAll(mSharedPreference.getAll());
}});
mSharedPreference.registerOnSharedPreferenceChangeListener(mOnSharedPreferenceChangeListener);
}
@Override
protected void onInactive() {
super.onInactive();
mSharedPreference.unregisterOnSharedPreferenceChangeListener(mOnSharedPreferenceChangeListener);
}
SharedPreferences.OnSharedPreferenceChangeListener mOnSharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, String key) {
if (sharedPreferences.contains(key)) {
getValue().put(key, sharedPreferences.getAll().get(key));
} else {
getValue().remove(key);
}
}
};
}
然后在ViewModel中声明SharedPreferences的LiveData
public static class ViewModel extends AndroidViewModel {
public final SharedPreferencesLiveData sharedPreferenceLiveData = new SharedPreferencesLiveData(getApplication().getSharedPreferences("XXX", 0));
public ViewModel(@NonNull Application application) {
super(application);
}
}
9条答案
按热度按时间dgjrabp21#
下面这段代码是SharedPreference的LiveData实现,运行得非常完美。
ztigrdn82#
Java Code by Idish,虽然他在此处进行了评论,但不确定他为什么不将其添加为答案。
粘贴下面相同的代码:
共享首选项布尔实时数据类
调用此链接中提到的以下代码:
同样,如果使用Preference Helper类,则可以按如下方式调用该类:仅举一例:
并在活动类中调用如下:创建对象:
并观察如下:
v64noz0r3#
假设您的网络请求已经为您提供了一个LiveData类,例如Retrofit和一个CallAdapter(如LiveDataCallAdapter)。
通过以下任一方法获得最后一个观察值后:
OnSharedPreferenceChangeListener
应用侦听器来更新MutableLiveData然后,您可以将以前的LiveData应用于:
这是UserViewModel.kt中Transformations.switchMap的相关示例:
w6lpcovy4#
Android最近发布了DataStore,它是:
Jetpack DataStore是一个数据存储解决方案,允许您使用协议缓冲区存储键值对或类型化对象。DataStore使用Kotlin协程和Flow以异步、一致和事务方式存储数据。
如果您当前使用SharedPreferences存储数据,请考虑迁移到DataStore。
下面是详细情况:
在项目的
build.gradle
中:数据库类如下所示:
在活动中:
xjreopfe5#
我创建了一个纯kotlin库来完成此操作-https://github.com/Jintin/PreferencesExtension
我们要做的就是:
并确保preferenceLiveData可以在ViewModel内部,让Activity/Fragment观察它。Activity、ViewModel
nwnhqdif6#
我看到您的挑战是在ViewModel或LiveData中调用API时调用共享首选项值。
您可以在Application类中将共享首选项定义为全局(因此它将是全局的)
您还可以通过在ViewModel中调用共享首选项来更新或保存值
希望这对你有帮助,因为我看到你的问题,这是为我工作,并能够插入参数的API调用。
xfyts7mz7#
在build.gradle(:app)中添加以下依赖项
将下面的代码添加到您的首选项class/utils
//获取其他类上的观察者/流/实时值,例如MainActivity.class等。
uajslkp68#
您可以在单个LiveData中组织所有SharedPreferences值
然后在ViewModel中声明SharedPreferences的LiveData
然后从XML布局访问和更新(双向数据绑定)您的SharedPreferences
uxhixvfz9#
我还想知道如何监听Preferences Activity中的首选项更改,它是
PreferenceFragmentCompat
的片段,但事实证明,如果MainActivity
在按下“Up”按钮后刷新,则无需“订阅”更改。在AndroidManifest
中,如果设置了android:launchMode
,它应该是“standard”(这将导致MainActivity
在从另一个Activity导航到它之后被刷新)。然后,您可以简单地使用PreferenceManager.getDefaultSharedPreferences
来获得首选项,如文档中所述,可以从任何地方访问PreferenceManager.getDefaultSharedPreferences
。