我设置了DataBinding,并使用ViewPager BindingAdapter在屏幕之间切换:
BindingAdapter
@BindingAdapter("app:nextPageListener") fun nextPageListener(viewPager: ViewPager, next: Boolean?) {
next ?: return
if (next) viewPager.nextPage()
else viewPager.previousPage()
}
View Pager
<ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent"
app:nextPageListener="@{viewModel.nextPageListener}"
/>
viewModel.nextPageListener
private val _nextPageListener = MutableLiveData<Boolean>()
val nextPageListener: LiveData<Boolean> get() = _nextPageListener
[我的问题是,如果我呼叫_nextPageListener.postValue(true)
并转到下一页,并离开屏幕,在某个时候离开屏幕,当我返回BindingAdapter
时会自动用true
进行调用,这会使寻呼机转到下一页。因此基本上在接下来的所有时间中,都在第二个屏幕上打开寻呼机。
不确定它是否与生命周期有关,但是否有帮助,这正是我所拥有的
binding.lifecycleOwner = viewLifecycleOwner
任何想法,如果没有一些丑陋的解决方法,如何解决此问题?
是。您可以使用Event
类。
open class Event<out T>(private val content: T) {
var hasBeenHandled = false
private set // Allow external read but not write
/**
* Returns the content and prevents its use again.
*/
fun getContentIfNotHandled(): T? {
return if (hasBeenHandled) {
null
} else {
hasBeenHandled = true
content
}
}
/**
* Returns the content, even if it's already been handled.
*/
fun peekContent(): T = content
}
现在您可以像这样包装LiveData
。
private val _nextPageListener = MutableLiveData<Event<Boolean>>()
val nextPageListener: LiveData<Event<String>> get() = _nextPageListener
以及活动的最后一步。
yourVm.nextPageListener.observe(this, Observer {
it.getContentIfNotHandled()?.let {
when (it) {
//get Your value here.
}
}
})