2

我有一个带有 AppBarLayout 的折叠工具栏的 CoordinatorLayout。我的布局文件层次结构看起来像(省略了 layout_width 等参数):

<CoordinatorLayout>
   <AppBarLayout>
      <CollapsingToolbarLayout 
       app:layout_scrollFlags="scroll|exitUntilCollapsed">
         <LinearLayout id="nested_fragment_host"/>
         <Toolbar/>
      </CollapsingToolbarLayout>
   <AppBarLayout>
   <NestedScrollView/>
</CoordinatorLayout>

AppBarLayout 中的扩展区域是片段,我动态添加:

transaction.replace(R.id.nested_fragment_host, new MyFragment(), FRAGMENT_TAG);

总的来说,它工作正常,但是如果用户在展开/折叠中间停止滚动,我需要自动展开/折叠 AppBarLayout(因此当用户从屏幕上移开手指时,AppBarLayout 应该展开或折叠,不允许中间状态)。对于这个任务,我决定使用自定义行为:

public class Behavior extends AppBarLayout.Behavior {
        private int cumulativeDy = 0;

        @Override
        public boolean onStartNestedScroll(@NonNull CoordinatorLayout parent, @NonNull AppBarLayout child, @NonNull View directTargetChild, @NonNull View target, int nestedScrollAxes) {
            boolean result = nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL;
            return result;
        }

        @Override
        public void onNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull AppBarLayout child, @NonNull View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {
            super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);
            cumulativeDy += dyUnconsumed;
        }

        @Override
        public void onStopNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull AppBarLayout abl, @NonNull View target) {
            super.onStopNestedScroll(coordinatorLayout, abl, target);

            if (cumulativeDy < 0) {
                abl.setExpanded(true, true);
            } else {
                abl.setExpanded(false, true);
            }
            cumulativeDy = 0;
        }
    }

我的问题来了:当 AppBarLayout 折叠并且用户开始展开它时,它工作得很好。但在相反的情况下,当 AppBarLayout 展开时 - 如果用户在 NestedScrollView 上开始滚动手势 - 我的 Behavior 类被调用并且很好。但是,如果用户在 AppBarLayout 内容上启动滚动手势 - 不会调用 Behavior,但 AppBarLayout 开始对滚动手势做出反应。在这种情况下,如果用户在过渡过程中停止滚动手势,我无法检测到它。有人知道这种行为的原因吗?是否可以调用 Behavior 类?如果不是,如何确定用户在嵌套视图上执行滚动?

4

0 回答 0