显示表情符号

随着用户越来越多地使用各种应用中的表情符号,Unicode 每年都会更新标准表情符号集

如果您的应用显示互联网内容或提供文本输入, 我们强烈建议您支持最新的表情符号字体 。否则,较新的表情符号可能会显示为称为“豆腐块” (□) 的小方块或其他错误呈现的表情符号序列。

Android 11(API 级别 30)及更低版本无法更新表情符号字体,因此,如果应用要在这些较低的版本上显示最新的表情符号字体,必须手动进行更新。

以下是一些新式表情符号的示例。

示例 版本
🫩 🪉 🇨🇶 16.0(2024 年 9 月)
🐦‍🔥 🧑‍🧑‍🧒‍🧒 👩🏽‍🦽‍➡️ 🇲🇶 15.1(2023 年 9 月)
🩷 🫸🏼 🐦‍⬛ 15.0(2022 年 9 月)
🫠 🫱🏼‍🫲🏿 🫰🏽 14.0(2021 年 9 月)
😶‍🌫️ 🧔🏻‍♀️ 🧑🏿‍❤️‍🧑🏾 13.1(2020 年 9 月)
🥲 🥷🏿 🐻‍❄️ 13.0(2020 年 3 月)
🧑🏻‍🦰 🧑🏿‍🦯 👩🏻‍🤝‍👩🏼 12.1(2019 年 10 月)
🦩 🦻🏿 👩🏼‍🤝‍👩🏻 12.0(2019 年 2 月)

BOM 2023 年 3 月Compose UI 1.4)支持最新的表情符号 版本,包括向后兼容旧版 Android(最低为 API 21)。

此支持不需要对应用进行任何更改— 如果您使用 TextTextField(Material 2 或 Material 3)或 BasicTextBasicTextField,则可以开箱即用地获得新式表情符号支持。

在应用中测试最新表情符号的最佳方式是使用 API 30 或更低版本的真实设备。

如果您使用的是自定义表情符号解决方案,或者出于任何其他原因需要停用 Compose 中的默认表情符号 解析,可以使用 PlatformTextStyle(emojiSupportMatch)

Text(
    text = "Hello $EMOJI_TEXT",
    style = TextStyle(
        platformStyle = PlatformTextStyle(
            emojiSupportMatch = EmojiSupportMatch.None
        )/* ... */
    )
)

互操作性

如果您的应用在同一 Activity 中同时使用 View 和 Compose,请确保您使用的是适当的 API 来正确配置表情符号。以下部分介绍了何时使用每个 API。

ComponentActivity 扩展

如果您的 Activity 从 Compose ComponentActivity 而不是 AppCompatActivity 扩展,请按照在不使用 AppCompat 的情况下支持表情符号 说明进行操作。

由于您未扩展 AppCompatActivity,因此请将 Emoji2 库 添加到依赖项,并在视图中使用 EmojiTextView 而不是 TextView 微件,如以下代码段所示:

class MainActivity : ComponentActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val emojiTextView: EmojiTextView = findViewById(R.id.emoji_text_view)
        emojiTextView.text = getString(R.string.emoji_text_view, EMOJI_TEXT)

        val composeView: ComposeView = findViewById(R.id.compose_view)

        composeView.apply {
            setContent {
                // compose code
            }
        }
    }
}

然后,在 XML 文件中:

<androidx.emoji2.widget.EmojiTextView
    android:id="@+id/emoji_text_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    />

AppCompatActivity 扩展

如果您的 ActivityAppCompatActivity 扩展,则可以使用 ComposeView 调用可组合函数。使用 Text 可组合项时,表情符号在各个 Android 版本中都能正确呈现。

如果您是从 AppCompatActivity 扩展,请从 XML 扩充 TextView,以使表情符号正确呈现。

如果您要扩充 XML,则适用以下情况:

  • Activity 中,位于 ComposeView 外部。请注意以下代码段中 AppCompatActivityTextView 的用法:

class MyActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val emojiTextView: TextView = findViewById(R.id.emoji_text_view)
        emojiTextView.text = getString(R.string.emoji_text_view, EMOJI_TEXT)

        val composeView: ComposeView = findViewById(R.id.compose_view)

        composeView.apply {
            setContent {
                // compose code
            }
        }
    }
}

class MyActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(
            ComposeView(this).apply {
                setContent {
                    Column {
                        Text(EMOJI_TEXT)

                        AndroidViewBinding(ExampleViewBinding::inflate) {
                            emojiTextView.text = EMOJI_TEXT
                        }
                    }
                }
            }
        )
    }
}

如需在 AndroidView 内使用 ComposeView 膨胀文本,请使用 AppCompatTextView 正确呈现表情符号:

class MyActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(
            ComposeView(this).apply {
                setContent {
                    Column {
                        Text(EMOJI_TEXT)

                        AndroidView(
                            factory = { context -> AppCompatTextView(context) },
                            update = { it.text = EMOJI_TEXT }
                        )
                    }
                }
            }
        )
    }
}

如需了解详情,请参阅互操作性 API文档。

问题排查

如果您看到的是豆腐块 (□) 而不是表情符号,请先检查问题是否出在您的特定测试设备上。 您可以检查以下几个主要事项: