Android kotlin-如何为工具栏backbutton按创建属性委托
我有一个有工具栏的片段,我现在设置了后退按钮,如下所示:Android kotlin-如何为工具栏backbutton按创建属性委托,android,kotlin,Android,Kotlin,我有一个有工具栏的片段,我现在设置了后退按钮,如下所示: with(myToolBarView) { (activity as AppCompatActivity).setSupportActionBar(this) setNavigationOnClickListener { requireActivity().onBackPressed() } } 但是当我有其他片段时
with(myToolBarView) {
(activity as AppCompatActivity).setSupportActionBar(this)
setNavigationOnClickListener {
requireActivity().onBackPressed()
}
}
但是当我有其他片段时,这个代码就会一直重复。所以我希望我能做这样的事情:
BackButtonLegate的MyToolbar视图(此)
但问题是,视图只有在调用onCreateView之后才能准备好。因此,如果我试图在视图准备就绪之前访问它,我将得到null或一些异常。那我该怎么做呢
我尝试使用@OnLifecycleEvent(Lifecycle.Event.ON_CREATE),但我看不出这对我有什么帮助,而且我需要每次调用OnCreateView时调用代码,以防重新创建片段视图
更新:我现在[意识到片段的生命周期所有者使用片段视图生命周期][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.")
// }
class BackBtnDelegate(val fragment:fragment){
//运算符fun getValue(thisRef:Any?,属性:KProperty):字符串{
//return“$thisRef,感谢您将“${property.name}”委托给我!”
// }
初始化{
fragment.lifecycle.addObserver(对象:LifecycleObserver{
@onLiFeCycleeEvent(创建时的Lifecycle.Event.ON)
有趣的故事{
使用(myToolBarView){
(活动作为AppCompatActivity)。设置支持操作栏(此)
setNavigationOnClickListener{
Requiresponsibility().onBackPressed()
}
}
}
})
}
//运算符fun setValue(thisRef:Any?,属性:KProperty,值:String){
////println($value已分配给$thisRef中的“${property.name}”。)
// }
请注意,我甚至不需要在这里设置或获取属性值,因为它们变得毫无意义,而且我仍然没有对myToolBarView的引用,所以如何才能实现这一点?
[1] :这不是工作原理。引用:
在委托中,处理请求涉及两个对象:接收对象将操作委托给其委托
您可以为片段
类创建扩展函数:
fun Fragment.setToolbar(myToolbar:Toolbar){
使用(myToolbar){
(活动作为AppCompatActivity)。设置支持操作栏(此)
setNavigationOnClickListener{
Requiresponsibility().onBackPressed()
}
}
或者您可以在BaseFragment
中使用公共函数,并让其他片段实现该类,但我想您已经知道了
classbasefragment:Fragment(){
...
受保护的工具栏(myToolbar:Toolbar){
使用(myToolbar){
(活动作为AppCompatActivity)。设置支持操作栏(此)
setNavigationOnClickListener{
Requiresponsibility().onBackPressed()
}
}
}
...
}
是的,可以从基类开始,但此时在组合中尽量避免这样做。委托正是我所希望的。扩展不是个坏主意