资源与适配 (Resources & Insets)
1. 访问资源
Compose 提供了方便的函数来访问 Android 资源。
kotlin
Text(text = stringResource(R.string.app_name))
// 带参数的字符串
Text(text = stringResource(R.string.welcome, "Alice"))
// 复数 (Plurals)
val count = 5
Text(text = pluralStringResource(R.plurals.items, count, count))kotlin
val padding = dimensionResource(R.dimen.padding_medium)
val columns = integerResource(R.integer.grid_columns)kotlin
val color = colorResource(R.color.primary)
// 推荐直接在 Compose Theme 中定义颜色,而不是读 xml2. 屏幕适配 (WindowInsets)
现代 Android 应用应该是“边到边” (Edge-to-Edge) 的,即内容延伸到状态栏和导航栏下方。
开启 Edge-to-Edge
在 Activity 的 onCreate 中:
kotlin
override fun onCreate(savedInstanceState: Bundle?) {
// 1. 开启全屏模式
enableEdgeToEdge()
super.onCreate(savedInstanceState)
setContent {
AppTheme {
// ...
}
}
}处理遮挡 (Safe Drawing)
使用 WindowInsets 修饰符来避开系统栏(状态栏、导航栏、刘海屏)。
kotlin
// Scaffold 默认会处理 windowInsets,但不包含 bottomBar 的 padding
// 你需要手动将 innerPadding 应用到内容
Scaffold(
// 如果你不想让 Scaffold 默认处理,可以传 WindowInsets(0)
contentWindowInsets = WindowInsets.safeDrawing
) { innerPadding ->
Box(Modifier.padding(innerPadding)) { /*...*/ }
}kotlin
Box(
modifier = Modifier
.fillMaxSize()
.background(Color.Blue)
// 仅在顶部增加状态栏高度的 padding
.windowInsetsPadding(WindowInsets.statusBars)
// 或者避开所有安全区域(包括刘海、底部横条)
// .windowInsetsPadding(WindowInsets.safeDrawing)
)kotlin
// 让内容随键盘弹起自动上移
Column(
modifier = Modifier
.fillMaxSize()
.imePadding() // 关键修饰符
.verticalScroll(rememberScrollState())
) {
// ... 输入框 ...
}3. 屏幕尺寸分类
为了适配手机、折叠屏和平板,可以使用 WindowSizeClass (需引入 androidx.compose.material3:material3-window-size-class)。
kotlin
@Composable
fun MyApp(windowSize: WindowWidthSizeClass) {
when (windowSize) {
WindowWidthSizeClass.Compact -> {
// 竖屏手机:显示底部导航栏
BottomNavigationScaffold()
}
WindowWidthSizeClass.Medium,
WindowWidthSizeClass.Expanded -> {
// 平板/横屏:显示侧边导航栏
NavigationRailScaffold()
}
}
}