How to avoid blocking of scrolling itself when using setNestedScrollingEnabled(false)?

后端 未结 8 1833
盖世英雄少女心
盖世英雄少女心 2020-12-30 01:07

Background

We have quite a complex layout that has CollapsingToolbarLayout in it, together with a RecyclerView at the bottom.

In certain cases, we tempora

8条回答
  •  梦毁少年i
    2020-12-30 02:01

    I want to present a nice alternative, mainly based on the one here :

    AppBarLayoutEx.kt

    class AppBarLayoutEx : AppBarLayout {
        private var isAppBarExpanded = true
        private val behavior = AppBarLayoutBehavior()
        private var onStateChangedListener: (Boolean) -> Unit = {}
        var enableExpandAndCollapseByDraggingToolbar: Boolean
            get() = behavior.canDrag
            set(value) {
                behavior.canDrag = value
            }
    
        var enableExpandAndCollapseByDraggingContent: Boolean
            get() = behavior.acceptsNestedScroll
            set(value) {
                behavior.acceptsNestedScroll = value
            }
    
        constructor(context: Context) : super(context)
        constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
    
        init {
            addOnOffsetChangedListener(
                    AppBarLayout.OnOffsetChangedListener { _, verticalOffset ->
                        isAppBarExpanded = verticalOffset == 0
                        onStateChangedListener(isAppBarExpanded)
                    })
        }
    
        override fun setLayoutParams(params: ViewGroup.LayoutParams?) {
            super.setLayoutParams(params)
            (params as CoordinatorLayout.LayoutParams).behavior = behavior
        }
    
        fun toggleExpandedState() {
            setExpanded(!isAppBarExpanded, true)
        }
    
        fun setOnExpandAndCollapseListener(onStateChangedListener: (Boolean) -> Unit) {
            this.onStateChangedListener = onStateChangedListener
        }
    
        private class AppBarLayoutBehavior : AppBarLayout.Behavior() {
            var canDrag = true
            var acceptsNestedScroll = true
    
            init {
                setDragCallback(object : AppBarLayout.Behavior.DragCallback() {
                    override fun canDrag(appBarLayout: AppBarLayout) = canDrag
                })
            }
    
            override fun onStartNestedScroll(parent: CoordinatorLayout, child: AppBarLayout, directTargetChild: View,
                                             target: View, nestedScrollAxes: Int, type: Int) = acceptsNestedScroll
        }
    }
    

    Usage: besides using it in the layout XML file, you can disable/enable the expanding of it using:

    appBarLayout.enableExpandAndCollapseByDraggingToolbar = true/false
    
    appBarLayout.enableExpandAndCollapseByDraggingContent = true/false
    

提交回复
热议问题