使用实时数据,如何只显示一次对话框?
Using live data, how to display a dialog only once?
我想使用实时数据显示带有消息的警报。我遇到的问题是,每当 activity 恢复时,警报都会再次弹出。有什么提示吗?
您可以使用只触发一次的自定义实时事件。这个讨论已经在 Android's Architecture Google Samples Repository. Here's a proposed solution I like 上进行了。
如果您在 kotlin 中需要它,那就是:
class SingleLiveEvent<T>: MutableLiveData<T>() {
private val pending = AtomicBoolean(false)
@MainThread
override fun observe(owner: LifecycleOwner, observer: Observer<T>) {
if (hasActiveObservers()) {
Log.w(TAG, "Multiple observers registered but only one will be notified of changes.")
}
// Observe the internal MutableLiveData
super.observe(owner, Observer<T> { t ->
if (pending.compareAndSet(true, false)) {
observer.onChanged(t)
}
})
}
@MainThread
override fun setValue(@Nullable t: T?) {
pending.set(true)
super.setValue(t)
}
/**
* Used for cases where T is Void, to make calls cleaner.
*/
@MainThread
fun call() {
value = null
}
companion object {
private val TAG = "SingleLiveEvent"
}
}
使用它不会触发你的对话两次,除非你再次调用 yourLiveData.value = newValue
。
希望对您有所帮助。
设置一个boolean isShown = false;
显示对话框时将其设置为 true 并将其保存到“共享”首选项。仅显示对话框 isShown 为 false。
我想使用实时数据显示带有消息的警报。我遇到的问题是,每当 activity 恢复时,警报都会再次弹出。有什么提示吗?
您可以使用只触发一次的自定义实时事件。这个讨论已经在 Android's Architecture Google Samples Repository. Here's a proposed solution I like 上进行了。
如果您在 kotlin 中需要它,那就是:
class SingleLiveEvent<T>: MutableLiveData<T>() {
private val pending = AtomicBoolean(false)
@MainThread
override fun observe(owner: LifecycleOwner, observer: Observer<T>) {
if (hasActiveObservers()) {
Log.w(TAG, "Multiple observers registered but only one will be notified of changes.")
}
// Observe the internal MutableLiveData
super.observe(owner, Observer<T> { t ->
if (pending.compareAndSet(true, false)) {
observer.onChanged(t)
}
})
}
@MainThread
override fun setValue(@Nullable t: T?) {
pending.set(true)
super.setValue(t)
}
/**
* Used for cases where T is Void, to make calls cleaner.
*/
@MainThread
fun call() {
value = null
}
companion object {
private val TAG = "SingleLiveEvent"
}
}
使用它不会触发你的对话两次,除非你再次调用 yourLiveData.value = newValue
。
希望对您有所帮助。
设置一个boolean isShown = false;
显示对话框时将其设置为 true 并将其保存到“共享”首选项。仅显示对话框 isShown 为 false。