CoordinatorLayout:让子 View 相互协作 · AndroidX 源码指南
AAndroidX 源码指南
View 体系
View 体系 · androidx.core

CoordinatorLayout:让子 View 相互协作Core 1.20.0-alpha01

Behavior 机制、嵌套滚动协调,以及 AppBarLayout/FloatingActionButton 的搭配。

最后更新 2026-08-01

复制即用

CoordinatorLayout 是 FrameLayout 的扩展,核心是 Behavior:每个直接子 View 可以绑定一个 Behavior,在依赖 View 变化、嵌套滚动、触摸事件时获得回调。

<androidx.coordinatorlayout.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <!-- AppBar -->
    </com.google.android.material.appbar.AppBarLayout>

    <androidx.core.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
        <!-- 内容 -->
    </androidx.core.widget.NestedScrollView>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

自定义 Behavior:

public class FadeBehavior extends CoordinatorLayout.Behavior<View> {
    public FadeBehavior() {}

    public FadeBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
        return dependency instanceof SomeAnchorView;
    }

    @Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
        child.setAlpha(1f - dependency.getTop() / (float) dependency.getHeight());
        return true;
    }
}

常见陷阱

  • 循环依赖:依赖关系决定布局顺序,被依赖的 View 必须先测量,避免 A 依赖 B 且 B 依赖 A。
  • Behavior 未注册:XML 中要用 app:layout_behavior="@string/..." 绑定,否则不生效。
  • 嵌套滚动不触发:子 View 必须实现 NestedScrollingChild 接口(RecyclerView/NestedScrollView 已实现)。
  • onNestedScroll 返回值:返回 true 表示消费了滚动,忘返回会导致滚动传递异常。

要点

  • layoutDependsOn 声明”我依赖谁”,onDependentViewChanged 在依赖 View 变化时收到回调。
  • onStartNestedScroll/onNestedScroll/onStopNestedScroll 参与嵌套滚动协调(CoordinatorLayout 实现了 NestedScrollingParent2)。
  • 常见搭配:AppBarLayout 的滚动 Behavior、FloatingActionButton 的 Snackbar 避让。
  • 依赖关系决定布局顺序:被依赖的 View 必须先测量,避免循环依赖。

相关页面