顯示表情符號

我們每年都會更新多種標準表情符號, 萬國碼 (Unicode),因為表情符號使用日漸增加 且能在各種應用程式中快速部署

如果應用程式會顯示網際網路內容或提供文字輸入,強烈建議 建議支援最新的表情符號字型否則,後續表情符號可能會顯示為名為「tofu」的小正方形方塊 (☐),或其他以錯誤方式呈現的表情符號序列。

Android 11 (API 級別 30) 以下版本無法更新表情符號字型,因此在這些較低版本上顯示表情符號的應用程式都必須手動更新。

以下是現代表情符號的範例。

範例 版本
🫠? 🫱? 🫲? 🫰? 🫰?遊 14.0 (2021 年 9 月)
😶‍🌫️ 🧔🏻‍♀️ 🧑🏿‍❤️‍🧑🏾 13.1 (2020 年 9 月)
🥲 🥷🏿 🐻‍❄️ 13.0 (2020 年 3 月)
🧑🏻‍🦰 🧑🏿‍🦯 👩🏻‍🤝‍👩🏼 12.1 (2019 年 10 月)
🦩 🦻🏿 👩🏼‍🤝‍👩🏻 12.0 (2019 年 2 月)

2023 年 3 月 BOM (Compose UI 1.4) 支援最新表情符號 版本,包括與舊版 Android 回溯相容 至 API 21

無須變更應用程式,即可使用這項支援功能。如果您使用 TextTextField (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」延伸

如果 ActivityAppCompatActivity 擴充,您可以使用 ComposeView 來呼叫可組合函式。表情符號在各種平台中都能正確顯示 使用 Text 可組合函式時產生的 Android 版本。

如果要從 AppCompatActivity 延伸,請透過 XML 加載 TextView 才能正確顯示表情符號

如果是加載 XML,則適用以下情況:

  • ComposeView 外部,在 Activity 中。請注意 以下程式碼片段中的 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
                        }
                    }
                }
            }
        )
    }
}

如要在 ComposeView 中使用 AndroidView 加載文字,請使用 使用 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 說明文件。

疑難排解

如果畫面顯示 tofu (☐) 而非表情符號,請先確認問題是否出在特定測試裝置。請檢查幾個主要項目: