Core 与 Core KTX:兼容层和语义化扩展 · AndroidX 源码指南
AAndroidX 源码指南
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)
}

核心思想WindowCompatViewCompatWindowInsetsCompat 把不同 Android 版本的行为收敛到一套入口——不需要手写 if (Build.VERSION.SDK_INT >= ...)

常用 Compat 类

用途
ViewCompat常见 View 行为的兼容入口
WindowCompat窗口特性(边到边、导航栏)
WindowInsetsCompat系统栏/输入法 Insets 的统一类型
ViewTreeLifecycleOwner / ViewTreeViewModelStoreOwnerView 树查找 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 判断。

相关页面