Wyświetl emotikony

Standardowy zestaw emotikonów jest co roku odświeżany przez Unicode, ponieważ ich użycie we wszystkich typach aplikacji szybko rośnie.

Jeśli Twoja aplikacja wyświetla treści z internetu lub umożliwia wprowadzanie tekstu, zdecydowanie zalecamy obsługę najnowszych czcionek emotikonów. W przeciwnym razie nowsze emotikony mogą być wyświetlane jako małe kwadratowe pole o nazwie tofu (☐) lub inne nieprawidłowo renderowane sekwencje emotikonów.

Wersje Androida 11 (poziom API 30) i starsze nie mogą aktualizować czcionki emotikonów, więc aplikacje, które wyświetlają je w tych wersjach, muszą być aktualizowane ręcznie.

Poniżej znajdziesz przykłady nowoczesnych emotikonów.

Przykłady Wersja
🫩 🪉 🇨🇶 16.0 (wrzesień 2024 r.)
🐦‍🔥 🧑‍🧑‍🧒‍🧒 👩🏽‍🦽‍➡️ 🇲🇶 15.1 (wrzesień 2023 r.)
🩷 🫸🏼 🐦‍⬛ 15.0 (wrzesień 2022 r.)
🫠 🫱🏼‍🫲🏿 🫰🏽 14.0 (wrzesień 2021 r.)
😶‍🌫️ 🧔🏻‍♀️ 🧑🏿‍❤️‍🧑🏾 13.1 (wrzesień 2020 r.)
🥲 🥷🏿 🐻‍❄️ 13.0 (marzec 2020 r.)
🧑🏻‍🦰 🧑🏿‍🦯 👩🏻‍🤝‍👩🏼 12.1 (październik 2019 r.)
🦩 🦻🏿 👩🏼‍🤝‍👩🏻 12.0 (luty 2019 r.)

BOM z marca 2023 r. (Compose UI 1.4) obsługuje najnowszą wersję emotikonów, w tym zapewnia zgodność wsteczną ze starszymi wersjami Androida do interfejsu API 21.

Ta obsługa nie wymaga żadnych zmian w aplikacji – jeśli używasz Text i TextField (Material 2 lub Material 3) albo BasicText i BasicTextField, od razu masz dostęp do obsługi współczesnych emotikonów.

Najlepszym sposobem na przetestowanie najnowszych emotikonów w aplikacji jest użycie prawdziwego urządzenia z interfejsem API na poziomie 30 lub niższym.

Jeśli używasz niestandardowego rozwiązania do obsługi emotikonów lub z innego powodu musisz wyłączyć domyślne rozwiązanie do obsługi emotikonów w Compose, możesz użyć PlatformTextStyle(emojiSupportMatch):

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

Interoperacyjność

Jeśli Twoja aplikacja używa zarówno widoków, jak i Compose w tym samym Activity, upewnij się, że używasz odpowiednich interfejsów API do prawidłowego konfigurowania emotikonów. W sekcjach poniżej opisujemy, kiedy należy używać poszczególnych interfejsów API.

Przedłużam od: ComponentActivity

Jeśli Activity rozszerza Compose ComponentActivity zamiast AppCompatActivity, postępuj zgodnie z instrukcjami Obsługa emotikonów bez AppCompat.

Ponieważ nie rozszerzasz klasy AppCompatActivity, dodaj bibliotekę Emoji2 do zależności i używaj w widokach klasy EmojiTextView zamiast widżetu TextView, jak pokazano w tym fragmencie kodu:

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
            }
        }
    }
}

Następnie w pliku XML:

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

Przedłużam od: AppCompatActivity

Jeśli klasa Activity rozszerza klasę AppCompatActivity, możesz użyć ComposeView, aby wywołać funkcje typu „composable”. Emoji są prawidłowo renderowane w różnych wersjach Androida, gdy używasz funkcji kompozycyjnych Text.

Jeśli rozszerzasz AppCompatActivity, rozwiń TextView z XML, aby emotikony były renderowane prawidłowo.

Dotyczy to sytuacji, gdy rozwijasz plik XML:

  • poza ComposeView, w Activity. Zwróć uwagę na użycie AppCompatActivity i TextView w tym fragmencie kodu:

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
                        }
                    }
                }
            }
        )
    }
}

Aby rozwinąć tekst za pomocą AndroidView wewnątrz ComposeView, użyj AppCompatTextView, aby prawidłowo renderować emotikony:

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 }
                        )
                    }
                }
            }
        )
    }
}

Szczegółowe informacje znajdziesz w dokumentacji interfejsów API interoperacyjności.

Rozwiązywanie problemów

Jeśli zamiast emotikonów widzisz tofu (☐), najpierw sprawdź, czy problem nie dotyczy konkretnego urządzenia testowego. Oto kilka najważniejszych rzeczy, które możesz sprawdzić: