You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin多平台:如何在Android实际声明中使用XML资源或自定义样式

解决Compose Multiplatform中EmojiPickerView的样式自定义问题

一、修复XML资源引用(解决R类找不到的问题)

在Kotlin多平台的shared模块androidMain目录中,直接引用R会因模块资源生成路径问题导致找不到,需使用完整包名引用R类:

  1. 确认shared模块的包名(可在shared/androidMain/AndroidManifest.xml的package属性中查看)
  2. 在代码中替换为完整路径:
@Composable
actual fun EmojiPicker() {
    AndroidView(
        factory = { context ->
            // 替换为你shared模块的实际包名
            EmojiPickerView(context, null, com.example.shared.R.style.EmojiPicker)
        },
    )
}
  1. 确保shared模块的android配置正确包含资源目录,在shared/build.gradle.kts的android块中添加:
android {
    sourceSets["main"].res.srcDirs("src/androidMain/res")
    // 其他原有配置...
}

二、不使用XML,直接通过代码自定义样式

若不想依赖XML资源,可直接通过代码设置EmojiPickerView的样式属性:

方法1:直接调用View的setter方法

针对EmojiPickerView支持的自定义属性,直接调用对应设置方法:

@Composable
actual fun EmojiPicker() {
    AndroidView(
        factory = { context ->
            EmojiPickerView(context).apply {
                // 示例:设置表情大小
                setEmojiSize(24.dp.toPx().toInt())
                // 设置背景色
                setBackgroundColor(Color.LightGray.toArgb())
                // 设置最近使用表情数量
                setRecentEmojiCount(20)
            }
        },
    )
}

方法2:用ContextThemeWrapper动态应用样式

若需批量设置主题属性,可创建ContextThemeWrapper结合TypedArray加载并修改属性:

@Composable
actual fun EmojiPicker() {
    AndroidView(
        factory = { context ->
            val themeContext = ContextThemeWrapper(context, androidx.emoji2.emojipicker.R.style.Theme_EmojiPicker)
            val attrs = themeContext.obtainStyledAttributes(
                null,
                androidx.emoji2.emojipicker.R.styleable.EmojiPickerView,
                0,
                0
            )
            // 修改背景色属性
            attrs.setColor(
                androidx.emoji2.emojipicker.R.styleable.EmojiPickerView_emojiPickerBackgroundColor,
                Color.LightGray.toArgb()
            )
            val emojiPicker = EmojiPickerView(themeContext, attrs)
            attrs.recycle()
            emojiPicker
        },
    )
}

内容的提问来源于stack exchange,提问作者Philipp Fahlteich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 19:55:00