【问题标题】:Android kotlin - how to create a property delegate for toolbar backbutton pressAndroid kotlin - 如何为工具栏后退按钮创建属性委托
【发布时间】: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

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    Delegation pattern 不是这样工作的。引用:

    在委托中,处理请求涉及两个对象:接收对象将操作委托给它的委托

    您可以为Fragment 类创建一个扩展函数:

    fun Fragment.setToolbar(myToolbar: Toolbar) {
        with(myToolbar) {
        (activity as AppCompatActivity).setSupportActionBar(this)
        setNavigationOnClickListener {
            requireActivity().onBackPressed()
        }
    }
    

    或者您可以在 BaseFragment 中使用通用函数并让其他 Fragment 实现该类,但我想您已经知道了。

    class BaseFragment : Fragment() {
       ...
    
        protected fun setToolbar(myToolbar: Toolbar) {
            with(myToolbar) {
                (activity as AppCompatActivity).setSupportActionBar(this)
                setNavigationOnClickListener {
                    requireActivity().onBackPressed()
                }
            }
        }
        
        ...
    }
    

    【讨论】:

    • 是的,可以从基类中做到这一点,但此时要尽量避免这种情况。代表是我所希望的。扩展不是一个坏主意
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 1970-01-01
    相关资源
    最近更新 更多