絵文字を表示

あらゆる種類のアプリで絵文字の使用が急速に増加しているため、標準の絵文字セットは 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)では、最新の絵文字バージョンがサポートされています。これには、API 21 までの古い Android バージョンとの下位互換性も含まれます。

このサポートのためにアプリを変更する必要はありません。Text と TextField(マテリアル 2 またはマテリアル 3)を使用している場合、または BasicText と BasicTextField を使用している場合は、最新の絵文字がすぐにサポートされます。

アプリで最新の絵文字をテストするには、API 30 以下の実機を使用するのが最適です。

カスタム絵文字ソリューションを使用している場合や、その他の理由で Compose のデフォルトの絵文字解決を無効にする必要がある場合は、PlatformTextStyle(emojiSupportMatch) を使用できます。

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

相互運用性

アプリで同じ Activity 内のビューと Compose の両方を使用している場合は、適切な API を使用して絵文字を正しく構成してください。以降のセクションでは、各 API を使用するタイミングについて説明します。

ComponentActivity から続きを生成

Activity が AppCompatActivity ではなく Compose ComponentActivity を拡張している場合は、AppCompat を使用せずに絵文字をサポートするの手順に沿って操作します。

AppCompatActivity を拡張していないため、Emoji2 ライブラリを依存関係に追加し、次のスニペットに示すように、TextView ウィジェットの代わりにビューで EmojiTextView を使用します。

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 をインフレートする場合に適用されます。

  • ComposeView の外、Activity。次のスニペットで 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
            }
        }
    }
}

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 のドキュメントをご覧ください。

トラブルシューティング

絵文字の代わりに豆腐(☐)が表示される場合は、まず、特定のテストデバイスに問題があるかどうかを確認します。主に次の点を確認できます。