Стандартный набор эмодзи ежегодно обновляется консорциумом Unicode, поскольку эмодзи используются все чаще во всех типах приложений.
Если в вашем приложении показывается контент из интернета или предусмотрен ввод текста, мы настоятельно рекомендуем поддерживать последние версии шрифтов эмодзи. В противном случае более поздние эмодзи могут отображаться как небольшой квадратный блок, называемый тофу (☐), или другие неправильно отрисованные последовательности эмодзи.
В Android 11 (уровень API 30) и более ранних версиях нельзя обновить шрифт эмодзи, поэтому приложения, в которых они показываются, нужно обновлять вручную.
Ниже приведены примеры современных эмодзи.
| Примеры | Версия |
|---|---|
| 🇨🇶 | 16.0 (сентябрь 2024 г.) |
| 🐦🔥 🧑🧑🧒🧒 👩🏽🦽➡️ 🇲🇶 | 15.1 (сентябрь 2023 г.) |
| 🩷 🫸🏼 🐦⬛ | 15.0 (сентябрь 2022 г.) |
| 🫠 🫱🏼🫲🏿 🫰🏽 | 14.0 (сентябрь 2021 г.) |
| 😶🌫️ 🧔🏻♀️ 🧑🏿❤️🧑🏾 | 13.1 (сентябрь 2020 г.) |
| 🥲 🥷🏿 🐻❄️ | 13.0 (март 2020 г.) |
| 🧑🏻🦰 🧑🏿🦯 👩🏻🤝👩🏼 | 12.1 (октябрь 2019 г.) |
| 🦩 🦻🏿 👩🏼🤝👩🏻 | 12.0 (февраль 2019 г.) |
BOM от марта 2023 г. (Compose UI 1.4) поддерживает последнюю версию эмодзи и обеспечивает обратную совместимость с более ранними версиями Android, вплоть до API 21.
Для поддержки современных эмодзи не нужно вносить изменения в приложение. Если вы используете Text и TextField (Material 2 или Material 3) или BasicText и BasicTextField, поддержка современных эмодзи будет включена по умолчанию.
Лучший способ проверить, как новые эмодзи выглядят в вашем приложении, – использовать реальное устройство с API 30 или более ранней версии.
Если вы используете собственное решение для эмодзи или вам нужно отключить эмодзи по умолчанию в режиме создания письма по какой-либо другой причине, вы можете использовать PlatformTextStyle(emojiSupportMatch):
Text( text = "Hello $EMOJI_TEXT", style = TextStyle( platformStyle = PlatformTextStyle( emojiSupportMatch = EmojiSupportMatch.None )/* ... */ ) )
Совместимость
Если в вашем приложении в одном и том же Activity используются как Views, так и 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 для вызова функций, которые можно комбинировать. При использовании текстовых элементов эмодзи корректно отображаются во всех версиях Android.
Если вы расширяете класс AppCompatActivity, разверните TextView из XML, чтобы эмодзи отображались корректно.
Это относится к случаям, когда вы раздуваете 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 } } } }
- внутри
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 отключен.
- Другие причины
- Текст в режиме создания письма
- Прокрутка