View 体系
View 体系 · androidx.core
Core 与 Core KTX:兼容层和语义化扩展Core 1.20.0-alpha01
使用兼容 API 与一次性 View 回调,避免手写版本分支和监听器清理。
最后更新 2026-08-01
复制即用:核心兼容 API
// 边到边窗口
WindowCompat.setDecorFitsSystemWindows(window, false)
// 系统栏 Insets 处理
ViewCompat.setOnApplyWindowInsetsListener(root) { view, insets ->
val bars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
view.updatePadding(
left = bars.left,
top = bars.top,
right = bars.right,
bottom = bars.bottom,
)
insets
}
// 一次性回调
toolbar.doOnLayout { laidOutToolbar ->
alignContentBelow(laidOutToolbar.height)
}核心思想:WindowCompat、ViewCompat、WindowInsetsCompat 把不同 Android 版本的行为收敛到一套入口——不需要手写 if (Build.VERSION.SDK_INT >= ...)。
常用 Compat 类
| 类 | 用途 |
|---|---|
ViewCompat | 常见 View 行为的兼容入口 |
WindowCompat | 窗口特性(边到边、导航栏) |
WindowInsetsCompat | 系统栏/输入法 Insets 的统一类型 |
ViewTreeLifecycleOwner / ViewTreeViewModelStoreOwner | View 树查找 owner |
ContextCompat | 资源、颜色、startActivity 兼容 |
KTX 一次性回调
view.doOnLayout { } // 布局完成后执行一次
view.doOnAttach { } // 附加窗口时
view.doOnDetach { } // 分离窗口时
view.doOnPreDraw { } // 绘制前
view.doOnNextLayout { } // 下次布局重要边界:KTX 扩展减少样板代码,不改变对象生命周期:
doOnLayout= 下一次满足条件时执行一次。- 持续监听仍需显式管理 listener(
addOnLayoutChangeListener+ 移除)。
Insets:用类型而非层级
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
val ime = insets.getInsets(WindowInsetsCompat.Type.ime())
val navigationBars = insets.getInsets(WindowInsetsCompat.Type.navigationBars())Type.systemBars()组合状态栏 + 导航栏。Type.ime()输入法(键盘)。- 不要用
insets.systemWindowInsetTop这类旧字段(按层级,容易错)。
Core 与 core-ktx 的关系
当前 checkout 中很多 Kotlin 扩展源码位于 core 模块本身,同时仍发布 core-ktx artifact。判断 API 所属依赖:
- 看模块
build.gradle和 API surface。 - 不能仅凭源文件扩展名猜 artifact。
依赖通常两者都加:
implementation("androidx.core:core-ktx:1.20.0-alpha01")常见陷阱
- 手写版本分支:用 Compat 类,别
if (SDK_INT >= ...)。 - 忘记移除 listener:一次性回调用完不清理。
- 旧 Insets 字段:
systemWindowInsetTop已废弃,用Type.systemBars()。 - KTX 当生命周期:KTX 回调不管理持续监听。
要点
- Compat 类收敛版本差异;KTX 减少样板。
doOnLayout等一次性回调;持续监听要自己清理。- Insets 用 Type 分类;别用废弃字段。
- core-ktx 源码在 core 模块,看 API surface 判断。