随着用户越来越多地使用各种应用中的表情符号,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)。
此支持不需要对应用进行任何更改— 如果您使用 Text 和
TextField(Material 2 或 Material 3)或 BasicText 和
BasicTextField,则可以开箱即用地获得新式表情符号支持。
在应用中测试最新表情符号的最佳方式是使用 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 扩展
如果您的 Activity 从 AppCompatActivity 扩展,则可以使用
ComposeView 调用可组合函数。使用 Text 可组合项时,表情符号在各个 Android 版本中都能正确呈现。
如果您是从 AppCompatActivity 扩展,请从 XML
扩充 TextView,以使表情符号正确呈现。
如果您要扩充 XML,则适用以下情况:
- 在
Activity中,位于ComposeView外部。请注意以下代码段中AppCompatActivity和TextView的用法:
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 } } } }
- 在
ComposeView中,通过使用 视图绑定 的AndroidViewBinding,如以下代码段所示:
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文档。
问题排查
如果您看到的是豆腐块 (□) 而不是表情符号,请先检查问题是否出在您的特定测试设备上。 您可以检查以下几个主要事项:
- 您可能使用的是最近刷写的设备或新的模拟器。如果可以,请尝试使用您经常使用的其他真实测试设备,该设备已登录您的 Google 账号。请注意,API 应为 30 或更低版本,以确保表情符号在正确的版本中正常运行。
- 测试手机不支持可下载字体。
- 检查正确的 Google Play 服务版本。
为您推荐
- 注意:当 JavaScript 处于关闭状态时,系统会显示链接文字
- 其他注意事项
- Compose 中的文字
- 滚动