文字与表情
文字与表情 · androidx.emoji2
Emoji2:让旧设备正确渲染表情Emoji2 1.6.0
初始化 EmojiCompat、处理 CharSequence,以及 Bundled 与 Views 扩展的用法。
最后更新 2026-08-01
复制即用
依赖:
implementation("androidx.emoji2:emoji2-bundled:1.6.0")使用 Bundled 配置初始化(放在 Application 的 onCreate):
import android.app.Application
import androidx.emoji2.text.EmojiCompat
import androidx.emoji2.bundled.BundledEmojiCompatConfig
class App : Application() {
override fun onCreate() {
super.onCreate()
val config = BundledEmojiCompatConfig(this)
EmojiCompat.init(config)
}
}处理字符串:
import androidx.emoji2.text.EmojiCompat
// 在表情元数据加载完成后调用
val processed: CharSequence = EmojiCompat.get().process("你好 🚀")监听加载状态:
import androidx.emoji2.text.EmojiCompat
val callback = object : EmojiCompat.InitCallback() {
override fun onInitialized() {
// 可以安全 process() 了
}
override fun onFailed(throwable: Throwable?) {}
}
EmojiCompat.get().registerInitCallback(callback)常见陷阱
- process() 抛异常:元数据未加载完成时调用
process()会抛IllegalStateException,先注册 InitCallback 或用getLoadState()判断。 - 重复 init:
EmojiCompat.init只调用一次,重复会抛异常(单例)。 - 下载配置依赖网络:
DefaultEmojiCompatConfig.create(context)走下载,离线设备回退 Bundled。 - Compose 场景:Compose 文本默认渲染表情,通常不需要 emoji2。
要点
EmojiCompat.init(config)只调用一次(EmojiCompat.java单例)。process()在元数据未加载完成时会抛异常;先注册InitCallback或用getLoadState()判断(LOAD_STATE_LOADING/SUCCEEDED/FAILED)。- Bundled 配置内置字体,无需网络;非 Bundled 的
DefaultEmojiCompatConfig.create(context)会走下载。 - View 体系用
emoji2-views的EmojiTextView等自动处理;Compose 通常不需要。