TextField и пользовательский ввод
Получайте текст от пользователя в Compose
«TextField и пользовательский ввод» — бесплатный урок Android Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 4 уроков всего.
Получение пользовательского ввода
Почти каждому настоящему приложению нужно что-то спросить у пользователя: имя, адрес электронной почты или поисковый запрос. В Jetpack Compose строительным блоком для ввода текста служит TextField.
На этом уроке Вы узнаете, как отображать текстовое поле, считывать введённый пользователем текст и поддерживать поле синхронизированным с состоянием приложения. Это основа любой формы, которую Вы когда-либо создадите.
Ваш первый TextField
Для TextField нужны две вещи: value (текущий отображаемый текст) и callback onValueChange (действие при вводе текста пользователем).
Compose использует декларативный подход, поэтому поле не хранит собственный текст. Вы храните текст в состоянии и передаёте его обратно в поле. Этот шаблон называется поднятием состояния.
@Composable
fun NameField() {
var name by remember { mutableStateOf("") }
TextField(
value = name,
onValueChange = { name = it }
)
}Как работает цикл значения
Самая важная идея: TextField показывает ровно то, что Вы передали в value. Когда пользователь нажимает клавишу, Compose вызывает onValueChange с новым текстом.
- Вы сохраняете этот новый текст в состоянии.
- Изменение состояния запускает рекомпозицию.
- Поле перерисовывается с обновлённым
value.
Если забыть обновить состояние внутри onValueChange, поле будет казаться замороженным, потому что value не меняется.
var name by remember { mutableStateOf("") }
TextField(
value = name,
onValueChange = { newText -> name = newText }
)Добавление подписи и подсказки
Обычное текстовое поле не объясняет пользователю, что вводить. Добавьте label (подпись, перемещающуюся над полем) и placeholder (подсказку, отображаемую, пока поле пусто).
Такие небольшие детали делают формы гораздо понятнее.
var email by remember { mutableStateOf("") }
TextField(
value = email,
onValueChange = { email = it },
label = { Text("Email") },
placeholder = { Text("you@example.com") }
)OutlinedTextField
Material Design предлагает два основных стиля. У TextField есть залитый фон, а OutlinedTextField рисует вокруг поля рамку. Они используют один и тот же API, поэтому переключиться между ними очень просто.
Поля с рамкой популярны в формах, потому что при вертикальном расположении их легко читать.
var username by remember { mutableStateOf("") }
OutlinedTextField(
value = username,
onValueChange = { username = it },
label = { Text("Username") },
singleLine = true
)Левые и правые значки
Поле можно украсить значками. leadingIcon отображается в начале поля (отлично подходит для значка поиска или электронной почты), а trailingIcon — в конце (часто это кнопка очистки).
Значки позволяют сразу понять назначение поля.
var query by remember { mutableStateOf("") }
OutlinedTextField(
value = query,
onValueChange = { query = it },
label = { Text("Search") },
leadingIcon = {
Icon(Icons.Default.Search, contentDescription = null)
}
)Кнопка очистки
Распространённый шаблон взаимодействия — маленький знак «x», очищающий поле. Показывайте его только при наличии текста, используя слот trailingIcon и IconButton.
Обратите внимание: очистка всего лишь возвращает состояние к пустой строке.
var text by remember { mutableStateOf("") }
OutlinedTextField(
value = text,
onValueChange = { text = it },
label = { Text("Note") },
trailingIcon = {
if (text.isNotEmpty()) {
IconButton(onClick = { text = "" }) {
Icon(Icons.Default.Clear, contentDescription = "Clear")
}
}
}
)Однострочный и многострочный режимы
По умолчанию TextField может расширяться на несколько строк. Для таких данных, как имя или адрес электронной почты, установите singleLine = true, чтобы пользователь не мог вставить перевод строки.
Для длинных заметок оставьте многострочный режим и при необходимости ограничьте высоту с помощью maxLines.
var bio by remember { mutableStateOf("") }
OutlinedTextField(
value = bio,
onValueChange = { bio = it },
label = { Text("Bio") },
maxLines = 4
)Мгновенная реакция на ввод
Поскольку Вы управляете состоянием текста, Вы можете мгновенно реагировать на его изменения. Классический пример — отображение счётчика символов под полем.
Каждое нажатие клавиши обновляет text, из-за чего рекомпозируются и поле, и расположенный под ним счётчик.
var text by remember { mutableStateOf("") }
Column {
OutlinedTextField(
value = text,
onValueChange = { text = it },
label = { Text("Tweet") }
)
Text("${text.length} / 280")
}Преобразование ввода
Иногда перед сохранением нужно нормализовать введённый пользователем текст. Внутри onValueChange сначала преобразуйте новое значение.
Здесь мы переводим имя пользователя в нижний регистр и удаляем пробелы. Поскольку Вы управляете циклом, поле всегда показывает очищенную версию.
var handle by remember { mutableStateOf("") }
OutlinedTextField(
value = handle,
onValueChange = { input ->
handle = input.lowercase().filterNot { it.isWhitespace() }
},
label = { Text("Handle") },
singleLine = true
)Чистый Kotlin: очистка имени пользователя
Приведённая выше логика преобразования — это обычный Kotlin. Её можно проверять отдельно, без Android. Здесь то же правило очистки выполняется автономно.
Если хранить такую логику в чистых функциях, её будет легко проверять модульными тестами.
fun cleanHandle(input: String): String =
input.lowercase().filterNot { it.isWhitespace() }
fun main() {
println(cleanHandle(" John Doe "))
println(cleanHandle("ADA Lovelace"))
}Быстрая проверка
Что произойдёт, если callback onValueChange у TextField никогда не обновляет состояние, переданное в value?
Итоги
Теперь Вы знаете основы ввода текста в Compose:
TextFieldиOutlinedTextFieldпринимаютvalueи callbackonValueChange.- Вы храните текст в
remember { mutableStateOf(...) }и обновляете его при каждом изменении (поднятие состояния). label,placeholder, левые и правые значки, а такжеsingleLineопределяют внешний вид и поведение.- Поскольку Вы управляете состоянием, Вы можете реагировать на ввод в реальном времени или преобразовывать его по мере набора.
Далее: управление состоянием всей формы, а не только одного поля.
Изучай Kotlin с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 36
- Уроки
- 152
Часто задаваемые вопросы
Урок «TextField и пользовательский ввод» бесплатный?
Да — полный текст урока «TextField и пользовательский ввод» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 4 уроков всего.
Чему я научусь в уроке «TextField и пользовательский ввод»?
Получайте текст от пользователя в Compose Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Android Academy?
Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «TextField и пользовательский ввод»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Android Academy?
Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- TextField и пользовательский ввод
- Управление состоянием формы
- Проверка ввода
- Параметры и действия клавиатуры