Для ввода текста в приложении предназначен компонент TextField. Он имеет несколько версий, возьмем одну из них:
@Composable fun TextField( value: String, onValueChange: (String) -> Unit, modifier: Modifier = Modifier, enabled: Boolean = true, readOnly: Boolean = false, textStyle: TextStyle = LocalTextStyle.current, label: (@Composable () -> Unit)? = null, placeholder: (@Composable () -> Unit)? = null, leadingIcon: (@Composable () -> Unit)? = null, trailingIcon: (@Composable () -> Unit)? = null, prefix: (@Composable () -> Unit)? = null, suffix: (@Composable () -> Unit)? = null, supportingText: (@Composable () -> Unit)? = null, isError: Boolean = false, visualTransformation: VisualTransformation = VisualTransformation.None, keyboardOptions: KeyboardOptions = KeyboardOptions.Default, keyboardActions: KeyboardActions = KeyboardActions.Default, singleLine: Boolean = false, maxLines: Int = if (singleLine) 1 else Int.MAX_VALUE, minLines: Int = 1, interactionSource: MutableInteractionSource? = null, shape: Shape = TextFieldDefaults.shape, colors: TextFieldColors = TextFieldDefaults.colors() ): Unit
Основные параметры компонента:
value
: представляет введенное в текстовое поле значение в виде строки, то есть объекта String
onValueChange
: функция обработки изменения введенного значения. Представляет функцию типа (String) -> Unit
modifier
: объект типа Modifier, который задает модификаторы компонента
enabled
: устанавливает, будет ли поле доступно для ввода. Представляет значение типа Boolean. По умолчанию равно true
, то есть поле доступно для ввода
readOnly
: устанавливает, будет ли поле доступно только для чтения. Представляет значение типа Boolean. По
умолчанию равно false
, то есть поле доступно не только для чтения, но для изменения значения
textStyle
: объект типа TextStyle, который устанавливает стиль текста. Значение по умолчанию - LocalTextStyle.current
label
: устанавливает дополнительную метку, которая отображается внутри поля. Для установки метки применяется функция типа
() -> Unit. Значение по умолчанию - null
placeholder
: плейсхолдер - временный текст, который отображается внутри поля. Для установки этого текста применяется функция типа
() -> Unit. Значение по умолчанию - null
leadingIcon
: устанавливает иконку, которая отображается перед текстом. Для установки применяется функция типа
() -> Unit. Значение по умолчанию - null
trailingIcon
: устанавливает иконку, которая отображается после текста. Для установки применяется функция типа
() -> Unit. Значение по умолчанию - null
isError
: указывает, является ли текущее введенное в поле значение некорректным. Представляет значение типа Boolean. По
умолчанию равно false
, то есть введенное значение корректно. Если равно true
, то для поля
устанавливаютс соответствующие индикаторы - метка, иконка, выделение цветом, которые поддчеркивают, что введенное значение некорректно.
visualTransformation
: объект типа VisualTransformation, который задает визуальные трансформации для вводимого текста. Значение по умолчанию - VisualTransformation.None
keyboardOptions
: объект KeyboardOptions, который задает параметры клавиатуры (например, ее тип).
Значение по умолчанию - KeyboardOptions.Default
keyboardActions
: KeyboardActions, который задает набор функций, которые вызываются в ответ на некоторые действия пользователя.
Значение по умолчанию - KeyboardActions()
singleLine
: устанавливает, будет ли текст однострочным. По умолчанию равно false
, то есть поле будет многосточным
maxLines
: задает максимальное количество строк в поле. По умолчанию равно Int.MAX_VALUE
minLines
: задает минимальное количество строк в поле. По умолчанию равно 1
interactionSource
: объект MutableInteractionSource, который задает поток взаимодействий для поля ввода.
Значение по умолчанию - remember { MutableInteractionSource() }
shape
: представляет объект Shape, который задает форму для поля ввода.
Значение по умолчанию - MaterialTheme.shapes.small.copy(bottomEnd = ZeroCornerSize, bottomStart = ZeroCornerSize)
colors
: объект TextFieldColors, который задает цвета для поля ввода.
Значение по умолчанию - TextFieldDefaults.textFieldColors()
Определение простейшего поля ввода:
package com.example.helloapp import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.material3.TextField class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { TextField(value = "Hello Work", onValueChange = {}) } } }
При создании поля необходимо задать как минимум два параметра - текущее значение (параметр value) и функцию обработки ввода текста (параметр onValueChange).
Параметр onValueChange
принимает функцию обработки ввода текста. Она в качестве параметра получает введенный текст в виде объекта String:
package com.example.helloapp import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.layout.Column import androidx.compose.material3.Text import androidx.compose.material3.TextField import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.text.TextStyle import androidx.compose.ui.unit.sp class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { val message = remember{mutableStateOf("")} Column { Text(message.value, fontSize = 28.sp) TextField( value = message.value, textStyle = TextStyle(fontSize=25.sp), onValueChange = {newText -> message.value = newText} ) } } } }
В данном случае мы определяем переменную message
, которая будет хранить введенный текст.
Однако это не просто строка. Она будет представлять объект типа MutableState<String>, который создается функцией
mutableStateOf(). В дальнейшем мы подробнее разберем объект MutableState
и функцию mutableStateOf, а пока достуточно знать, что в эту функцию передается собственно хранимое значение, которое затем можно получить
с помощью свойства value
объекта MutableState<T>
. А функция remember позволяет сохранить это значение.
В коде с помощью свойства value
мы привязываем значение переменной к свойству text компонента Text и свойству value компонента TextField:
Text(message.value, fontSize = 28.sp) TextField( value = message.value,
А в функции обработки ввода текста передаем в переменную введенный текст:
onValueChange = {newText -> message.value = newText}
В данном случае функция задается с помощью лямбда-выражения, где параметр newText
представляет введенный текст.
В итоге при ввода текста в поле изменится значение в переменной message и соответственно изменится текст компонента Text.
В зависимости от задач приложения может потребоваться вводить разную информацию - когда буквы, когда числа и т.д. Для упрощения ввода Jetpack Compose предоставляет тип KeyboardType, который позволяет настроить тип клавиатуры с помощью своих свойств:
KeyboardType.Ascii
: предоставляет ввод символов ASCII
KeyboardType.Email
: для ввода электронного адреса
KeyboardType.Number
: для ввода цифр
KeyboardType.NumberPassword
: для ввода пароля из цифр
KeyboardType.Password
: для ввода пароля
KeyboardType.Phone
: для ввода номера телефона
KeyboardType.Text
: предоставляет стандартную клавиатуру
KeyboardType.Uri
: предоставляет клавиатуру для ввода URI
С помощью параметра keyboardOptions
, который представляет класс KeyboardOptions, можно задать тип клавиатуры.
Например, применим клавиатуру для ввода номера телефона:
package com.example.helloapp import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.TextField import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.sp class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { val phone = remember{mutableStateOf("")} TextField( phone.value, {phone.value = it}, textStyle = TextStyle(fontSize = 28.sp), keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Phone) ) } } }
Параметр leadingIcon
задает иконку перед текстом, а параметр trailingIcon
- иконку после текста. В качестве значения оба параметра
принимают функцию типа () -> Unit
. Определим иконки для поля ввода:
package com.example.helloapp import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Check import androidx.compose.material.icons.filled.Info import androidx.compose.material3.Icon import androidx.compose.material3.TextField import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.text.TextStyle import androidx.compose.ui.unit.sp class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { val message = remember{mutableStateOf("")} TextField( message.value, {message.value = it}, textStyle = TextStyle(fontSize = 28.sp), leadingIcon = { Icon(Icons.Filled.Check, contentDescription = "Проверено") }, trailingIcon = { Icon(Icons.Filled.Info, contentDescription = "Дополнительная информация") } ) } } }
Для определения иконок применяется встроенный тип androidx.compose.material.Icon
, в функцию которого передается значок иконки.
В данном случае применяются встроенные иконки Icons.Filled.Check
и Icons.Filled.Info
. Второй параметр - contentDescription позволяет
указать к иконке описание.
Параметр placeholder
устанавливает плейсхолдер или заменитель текста, отображаемый в поле ввода, в виде другого компонента:
package com.example.helloapp import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.material3.Text import androidx.compose.material3.TextField import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.text.TextStyle import androidx.compose.ui.unit.sp class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { val message = remember{mutableStateOf("")} TextField( message.value, {message.value = it}, textStyle = TextStyle(fontSize = 28.sp), placeholder = { Text("Hello Work!") } ) } } }
Параметр colors
, который представляет объект интерфейса TextFieldColors, задает цвета для поля ввода. По умолчанию он принимает компонент
TextFieldDefaults.textFieldColors()
/TextFieldDefaults.colors()
, который устанавливает цвета для самых различных состояний:
focusedTextColor
: цвет, используемый для ввода текста этого текстового поля при фокусировке.
unfocusedTextColor
: цвет, используемый для ввода текста этого текстового поля, когда он не сфокусирован
disabledTextColor
: цвет, используемый для ввода текста этого текстового поля, когда он отключен.
errorTextColor
: цвет, используемый для ввода текста этого текстового поля в состоянии ошибки.
focusedContainerColor
: цвет контейнера текстового поля в фокусе.
unfocusedContainerColor
: цвет контейнера текстового поля, когда он не сфокусирован.
disabledContainerColor
: цвет контейнера текстового поля, когда он отключен.
errorContainerColor
: цвет контейнера текстового поля в состоянии ошибки.
cursorColor
: цвет курсора текстового поля
errorCursorColor
: цвет курсора текстового поля в состоянии ошибки.
selectionColors
: цвета, используемые при выборе входного текста этого текстового поля.
focusedIndicatorColor
: цвет индикатора текстового поля при фокусировке.
unfocusedIndicatorColor
: цвет индикатора текстового поля, когда оно не сфокусировано.
disabledIndicatorColor
: цвет индикатора текстового поля, когда он отключен.
errorIndicatorColor
: цвет индикатора текстового поля в состоянии ошибки.
focusedLeadingIconColor
: цвет ведущего значка текстового поля в фокусе.
unfocusedLeadingIconColor
: цвет ведущего значка текстового поля, когда он не сфокусирован.
disabledLeadingIconColor
: цвет ведущего значка текстового поля, когда он отключен.
errorLeadingIconColor
: цвет ведущего значка текстового поля в состоянии ошибки.
focusedTrailingIconColor
: цвет конечного значка текстового поля в фокусе.
unfocusedTrailingIconColor
: цвет конечного значка текстового поля, когда он не в фокусе.
disabledTrailingIconColor
: цвет конечного значка текстового поля, когда он отключен.
errorTrailingIconColor
: цвет конечного значка текстового поля в состоянии ошибки.
focusedLabelColor
: цвет метки текстового поля при фокусировке.
unfocusedLabelColor
: цвет метки текстового поля, когда оно не сфокусировано.
disabledLabelColor
: цвет метки текстового поля, когда он отключен.
errorLabelColor
: цвет метки текстового поля в состоянии ошибки.
focusedPlaceholderColor
: цвет заполнителя текстового поля в фокусе.
unfocusedPlaceholderColor
: цвет заполнителя текстового поля, когда он не сфокусирован.
disabledPlaceholderColor
: цвет заполнителя текстового поля, когда он отключен.
errorPlaceholderColor
: цвет заполнителя текстового поля в состоянии ошибки.
focusedSupportingTextColor
: вспомогательный цвет текста текстового поля при фокусе.
unfocusedSupportingTextColor
: вспомогательный цвет текста текстового поля, когда он не сфокусирован
disabledSupportingTextColor
: вспомогательный цвет текста текстового поля, когда он отключен.
errorSupportingTextColor
: вспомогательный цвет текста текстового поля в состоянии ошибки.
focusedPrefixColor
: цвет префикса текстового поля в фокусе.
unfocusedPrefixColor
: цвет префикса текстового поля, когда оно не сфокусировано.
disabledPrefixColor
: цвет префикса текстового поля, когда он отключен.
errorPrefixColor
: цвет префикса текстового поля в состоянии ошибки.
focusedSuffixColor
: цвет суффикса текстового поля в фокусе.
unfocusedSuffixColor
: цвет суффикса текстового поля, когда оно не сфокусировано.
disabledSuffixColor
: цвет суффикса текстового поля, когда он отключен.
errorSuffixColor
: цвет суффикса текстового поля в состоянии ошибки.
Мы можем использовать этот компонент для настройки цветовой гаммы поля ввода:
package com.example.helloapp import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.material3.TextField import androidx.compose.material3.TextFieldDefaults import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.TextStyle import androidx.compose.ui.unit.sp class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { val message = remember{mutableStateOf("Hello")} TextField( message.value, {message.value = it}, textStyle = TextStyle(fontSize = 28.sp), colors = TextFieldDefaults.colors( unfocusedContainerColor = Color(0xffeeeeee), unfocusedTextColor = Color(0xff888888), focusedContainerColor = Color.White, focusedTextColor = Color(0xff222222), ) ) } } }
В данном случае для текста и фона устанавливаются разные цвета в зависимости от того, получило текстовое поле фокус или нет:
Компонент OutlinedTextField во многом похож на TextField
за тем исключением, что он добавляет границу вокуг поля ввода. Простейшее определение компонента OutlinedTextField:
package com.example.helloapp import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.material3.OutlinedTextField import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.text.TextStyle import androidx.compose.ui.unit.sp class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { val message = remember{mutableStateOf("Hello")} OutlinedTextField( message.value, {message.value = it}, textStyle = TextStyle(fontSize = 30.sp) ) } } }
В функции компонента OutlinedTextField мы видим, что в отличие от TextField, меняется стандартное значение для последнего параметра - colors
, который устанавливает цвета.
Теперь он по умолчанию равен компоненту TextFieldDefaults.outlinedTextFieldColors()
. Фактически здесь мы можем установить те же самые цвета за тем исключением, что мы также можем настроить текст границы
с помощью таких параметов как focusedBorderColor
, unfocusedBorderColor
, disabledBorderColor
и errorBorderColor
, который позволяют установить цвет границы для различных состояний поля ввода. Например:
package com.example.helloapp import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.OutlinedTextFieldDefaults import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.TextStyle import androidx.compose.ui.unit.sp class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { val message = remember{mutableStateOf("Hello")} OutlinedTextField( message.value, {message.value = it}, textStyle = TextStyle(fontSize = 30.sp), colors = OutlinedTextFieldDefaults.colors( focusedBorderColor= Color(0xff16a085), // цвет при получении фокуса unfocusedBorderColor = Color(0xffcccccc) // цвет при отсутствии фокуса ) ) } } }