Текст лежит в основе социальных приложений, где пользователи делятся мыслями, выражают эмоции и рассказывают истории. В этом документе рассматривается, как эффективно работать с текстом, уделяя особое внимание смайликам, стилизации и интеграции богатого контента.
Работа с эмодзи
Эмодзи стали неотъемлемой частью современного общения, особенно в социальных сетях и приложениях для обмена сообщениями. Они преодолевают языковые барьеры, позволяя пользователям быстро и эффективно выражать эмоции и идеи.
Поддержка Emoji в Compose
Jetpack Compose, современный декларативный инструментарий пользовательского интерфейса Android, упрощает обработку смайлов:
-  Ввод : компонент TextFieldизначально поддерживает ввод эмодзи.
-  Отображение . Компонент Text» Compose правильно отображает смайлы, обеспечивая их единообразный вид на устройствах и платформах, которые предлагают поставщика загружаемых шрифтов, совместимого с emoji2, например на устройствах, работающих на сервисах Google Play .
Отображение смайлов охватывает отображение смайлов в Jetpack Compose, в том числе то, как убедиться, что ваше приложение отображает новейшие шрифты смайлов, как убедиться, что смайлы работают правильно, если ваше приложение использует и просмотры, и создание в одном и том же действии , и как устранить неполадки, когда смайлы не отображаются. не появляется, как ожидалось.
Поддержка Emoji в просмотрах
 Если вы используете Android Views, библиотека AppCompat 1.4 или выше обеспечивает поддержку смайлов для подклассов платформы TextView :
-  Ввод : версия EditTextдля AppCompat изначально поддерживает ввод эмодзи.
-  Display : версии AppCompat TextView,ToggleButton,Switch,Button,CheckedTextView,RadioButton,CheckBox,AutoCompleteTextViewиMultiAutoCompleteTextViewподдерживают отображение эмодзи, обеспечивая единообразный внешний вид на всех устройствах и платформах, которые предоставляют поставщика загружаемых шрифтов, совместимого с emoji2, например, на устройствах с питанием. сервисами Google Play .
 Если вы создаете собственное представление , которое является прямым или косвенным подклассом TextView , расширьте реализацию AppCompat (а не реализацию платформы), чтобы получить встроенную поддержку эмодзи. В разделе «Поддержка современных смайлов» показано, как тестировать и устранять неполадки интеграции смайлов, поддерживать смайлы без AppCompat, поддерживать смайлы в пользовательских представлениях, поддерживать альтернативные шрифты или поставщиков шрифтов и многое другое.
Использование средства выбора эмодзи
Средство выбора эмодзи Jetpack — это представление Android, которое предоставляет категоризированный список смайлов, прикрепленные варианты и поддержку недавно использованных смайлов, совместимое с несколькими версиями Android и устройствами. Это простой способ повысить уровень интеграции смайлов в вашем приложении.
 Начните с импорта библиотеки в build.gradle . 
dependencies {
   implementation("androidx.emoji2:emojipicker:$version")
}
Использование средства выбора эмодзи с Compose
 Вы создаете средство выбора Emoji в Compose, используя компонуемый AndroidView . Этот фрагмент включает в себя прослушиватель, который сообщает, когда выбран эмодзи:
AndroidView(
    modifier = Modifier.fillMaxSize(),
    factory = { context ->
        val emojiPickerView = EmojiPickerView(context)
        emojiPickerView.setOnEmojiPickedListener(this::updateTextField)
        emojiPickerView
    },
)
 В Compose 1.7 добавлено множество новых функций в BasicTextField , включая поддержку TextFieldState , которая может находиться в вашей ViewModel :
private val emojiTextFieldState = TextFieldState()
@Composable fun EmojiTextField() {
    BasicTextField(
        state = emojiTextFieldState,
    )
}
 Вы можете использовать TextFieldState для вставки текста в позицию курсора или замены выделенного текста, как если бы вы вводили его в IME:
private fun insertStringAsIfTyping(textFieldState: TextFieldState, string: String) {
    textFieldState.edit {
        replace(selection.start, selection.end, string)
        // clear selection on replace if necessary
        if (hasSelection) selection = TextRange(selection.end)
    }
}
 Обратный вызов может обновить BasicTextField с помощью вспомогательной функции: 
private fun updateTextField(emojiViewItem: EmojiViewItem) {
    insertStringAsIfTyping(emojiTextFieldState, emojiViewItem.emoji)
}
Использование средства выбора эмодзи с представлениями
Средство выбора эмодзи также хорошо работает с представлениями.
Раздуйте EmojiPickerView . При необходимости установите emojiGridColumns и emojiGridRows в зависимости от желаемого размера каждой ячейки эмодзи.
<androidx.emoji2.emojipicker.EmojiPickerView
    …
    app:emojiGridColumns="9" />
Вставьте символ в позицию курсора или замените выделенный текст:
// Consider unregistering/reregistering anyTextWatcher that you might have as part of this
private fun insertStringAsIfTyping(editText: EditText, string: String) {
    val stringBuffer = StringBuffer(editText.text.toString())
    val index = editText.selectionStart
    if ( !editText.hasSelection() ) {
        stringBuffer.insert(index, string)
    } else {
        stringBuffer.replace(index, editText.selectionEnd, string)
    }
    editText.setText(stringBuffer.toString())
    editText.setSelection(index + string.length)
}
 Предоставьте прослушиватель выбранных смайлов и используйте его для добавления символов в EditText . 
// a listener example
emojiPickerView.setOnEmojiPickedListener {
   val editText = findViewById<EditText>(R.id.edit_text)
   insertStringAsIfTyping(editText, it.emoji)
}
Стиль текста
Применяя к тексту визуальные различия, такие как стили, размеры, насыщенность и цвета шрифтов, вы можете улучшить читаемость, иерархию и общую эстетическую привлекательность пользовательского интерфейса вашего социального приложения или приложения для обмена сообщениями. Стили текста помогают пользователям быстро анализировать информацию, различать разные типы сообщений и идентифицировать важные элементы.
Стиль текста в Compose
 Компонуемый Text предлагает множество вариантов стилизации, в том числе:
-  Цвет текста : установите Color, чтобы текст выделялся.
-  Размер шрифта : Управляйте FontSizeдля соответствующего масштаба.
-  Стиль шрифта : используйте FontStyleдля выделения текста курсивом.
-  Вес шрифта : отрегулируйте FontWeightдля жирного, светлого и т. д. вариантов текста.
-  Семейство шрифтов : используйте FontFamily, чтобы выбрать подходящий шрифт.
Text(
    text = "Hello 👋",
    color = Color.Blue
    fontSize = 18.sp,
    fontWeight = FontWeight.Bold,
    fontFamily = FontFamily.SansSerif
)
Вы можете единообразно настроить эти параметры стиля во всем приложении с помощью тем .
MaterialTheme(
    // This theme would include Color.Blue (as appropriate for dark and light themes)
    colorScheme = colorScheme,
    content = content,
    typography = Typography(
        titleLarge = TextStyle(
            fontSize = 18.sp,
            fontFamily = titleFont,
            fontWeight = FontWeight.Bold
        ),
    ),
)
Добавить несколько стилей в текст
 Вы можете установить разные стили в одном компонуемом Text , используя AnnotatedString .
 AnnotatedString имеет типобезопасный конструктор buildAnnotatedString , упрощающий создание.
@Composable
fun MultipleStylesInText() {
    Text(
        buildAnnotatedString {
            withStyle(style = SpanStyle(color = Color.Blue)) {
                append("M")
            }
            append("y ")
            withStyle(style = SpanStyle(fontWeight = FontWeight.Bold, color = Color.Red)) {
                append("S")
            }
            append("tyle")
        }
    )
}
См. раздел «Стиль текста» для получения дополнительной информации о стилизации текста в Compose, включая добавление тени , расширенные стили с помощью кисти и непрозрачность .
Стиль текста в представлениях
При использовании представлений полагайтесь на стили и темы для обеспечения единообразия типографики. Дополнительные сведения о том, как применять пользовательские темы для представлений в вашем приложении, см. в разделе Стили и темы . Если вы хотите установить разные стили в одном текстовом представлении, см. раздел «Пространства» для получения дополнительной информации о том, как изменять текст различными способами, включая добавление цвета , создание кликабельности текста, масштабирование размера текста и рисование текста по индивидуальному заказу. .
Поддержка графических клавиатур и другого богатого контента.
Пользователи часто хотят общаться с помощью стикеров, анимации и другого разнообразного контента. Чтобы приложениям было проще получать разнообразный контент, в Android 12 (уровень API 31) представлен унифицированный API, который позволяет вашему приложению принимать контент из любого источника: буфера обмена, клавиатуры или перетаскивания. Для обратной совместимости с предыдущими версиями Android (в настоящее время обратно к уровню API 14) мы рекомендуем вам использовать версию этого API для Android Jetpack (AndroidX).
 Вы прикрепляете OnReceiveContentListener к компонентам пользовательского интерфейса и получаете обратный вызов, когда контент вставляется с помощью любого механизма. Обратный вызов становится единственным местом, где ваш код обрабатывает получение всего контента: от простого и стилизованного текста до разметки, изображений, видео, аудиофайлов и т. д.
 См. раздел Получение расширенного контента , чтобы узнать больше о том, как реализовать поддержку в вашем приложении. Jetpack Compose теперь имеет модификаторы dragAndDropSource и dragAndDropTarget которые упрощают реализацию перетаскивания внутри вашего приложения и между другими приложениями.
