Стандартный набор смайлов ежегодно обновляется Unicode , поскольку использование смайлов быстро растет для всех типов приложений.
Если ваше приложение отображает интернет-контент или обеспечивает ввод текста, мы настоятельно рекомендуем поддерживать новейшие шрифты эмодзи. В противном случае более поздние смайлы могут отображаться в виде небольшого квадратного прямоугольника под названием тофу (☐) или других неправильно отображаемых последовательностей смайлов.
Android версии 11 (уровень API 30) и ниже не может обновить шрифт эмодзи, поэтому приложения, отображающие их в этих версиях, необходимо обновлять вручную.
Ниже приведены примеры современных смайлов.
Примеры | Версия |
---|---|
🫠 🫱🏼🫲🏿 🫰🏽 | 14,0 (сентябрь 2021 г.) |
😶🌫️ 🧔🏻♀️ 🧑🏿❤️🧑🏾 | 13.1 (сентябрь 2020 г.) |
🥲 🥷🏿 🐻❄️ | 13,0 (март 2020 г.) |
🧑🏻🦰 🧑🏿🦯 👩🏻🤝👩🏼 | 12.1 (октябрь 2019 г.) |
🦩 🦻🏿 👩🏼🤝👩🏻 | 12.0 (февраль 2019 г.) |
В спецификации за март 2023 г. ( 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 )/* ... */ ) )
Совместимость
Если ваше приложение использует и Views, и Compose в одном и том же Activity
, убедитесь, что вы используете соответствующие 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 отключен.
- Другие соображения
- Текст в Compose
- Прокрутка