Skip to content

资源与适配 (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 中定义颜色,而不是读 xml

2. 屏幕适配 (WindowInsets)

现代 Android 应用应该是“边到边” (Edge-to-Edge) 的,即内容延伸到状态栏和导航栏下方。

开启 Edge-to-Edge

ActivityonCreate 中:

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()
        }
    }
}