【发布时间】:2020-09-15 03:32:44
【问题描述】:
我有一个带有工具栏的片段,我目前设置后退按钮听如下:
with(myToolBarView) {
(activity as AppCompatActivity).setSupportActionBar(this)
setNavigationOnClickListener {
requireActivity().onBackPressed()
}
}
但是当我有其他片段时,这段代码会一直重复。所以我希望我能做这样的事情: myToolBarView by backButtonDelegate(this)
但问题在于,在调用 onCreateView 之前视图不会准备好。因此,如果我尝试在视图准备好之前访问视图,我会得到 null 或一些异常。那么我该怎么做呢?
我尝试使用 @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) 但我看不出这对我有什么帮助,而且我每次调用 onoCreateView 时都需要调用代码,以防片段视图重新-创建。
更新:我现在[意识到片段的生命周期所有者与片段视图生命周期一起工作][1]
这就是我目前所拥有的:
class BackBtnDelegate(val fragment: Fragment) {
// operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
// return "$thisRef, thank you for delegating '${property.name}' to me!"
// }
init {
fragment.lifecycle.addObserver(object : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onDestroy() {
with(myToolBarView) {
(activity as AppCompatActivity).setSupportActionBar(this)
setNavigationOnClickListener {
requireActivity().onBackPressed()
}
}
}
})
}
// operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
// // println("$value has been assigned to '${property.name}' in $thisRef.")
// }
请注意,我什至不需要在此处设置或获取属性值,因为它们变得毫无意义,而且我仍然没有对 myToolBarView 的引用,那么我该如何实现呢? [1]:Fragment lifecycle events in LifeCycleAware Fragment
【问题讨论】: