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 必须先测量,避免循环依赖。