Configures custom actions to run when the action button on the software keyboard (such as the "Done", "Search", or "Next" button in the bottom corner of the keyboard) is clicked.
/**
* A complete profile registration screen sample. Shows how to handle standard name entries, login
* emails, physical mailing address lines, secure password visibility eye-icon togglers, and natural
* language biography summaries.
*/
@Sampled
@Composable
fun RegistrationFormSample() {
val nameState = rememberTextFieldState()
val emailState = rememberTextFieldState()
val passwordState = rememberTextFieldState()
var isPasswordVisible by remember { mutableStateOf(false) }
val urlState = rememberTextFieldState()
val addressState = rememberTextFieldState()
val biographyState = rememberTextFieldState()
Column(
verticalArrangement = Arrangement.spacedBy(12.dp),
modifier = Modifier.padding(16.dp).fillMaxWidth(),
) {
// 1. PersonName Input (Auto-Capitalizes Words)
OutlinedTextField(
state = nameState,
label = { Text("Full Name") },
keyboardOptions =
KeyboardOptions(
keyboardType = KeyboardType.PersonName,
capitalization = KeyboardCapitalization.Words,
imeAction = ImeAction.Next, // Soft keyboard automatically moves focus on Next
),
lineLimits = TextFieldLineLimits.SingleLine,
modifier = Modifier.fillMaxWidth(),
)
// 2. Email Input (Restricted layout showing '@' and '.', auto-capitalization disabled)
OutlinedTextField(
state = emailState,
label = { Text("Email") },
keyboardOptions =
KeyboardOptions(
keyboardType = KeyboardType.Email,
capitalization = KeyboardCapitalization.None,
imeAction = ImeAction.Next,
),
lineLimits = TextFieldLineLimits.SingleLine,
modifier = Modifier.fillMaxWidth(),
)
// 3. Password Input with Eye-Icon Toggle (masked vs visible password layouts,
// capitalizations disabled)
Row(verticalAlignment = Alignment.CenterVertically) {
OutlinedSecureTextField(
state = passwordState,
label = { Text("Password") },
textObfuscationMode =
if (isPasswordVisible) TextObfuscationMode.Visible
else TextObfuscationMode.System,
keyboardOptions =
KeyboardOptions(
keyboardType =
if (isPasswordVisible) KeyboardType.PasswordVisible
else KeyboardType.Password,
capitalization = KeyboardCapitalization.None,
imeAction = ImeAction.Next,
),
modifier = Modifier.weight(0.7f),
)
Spacer(Modifier.width(8.dp))
TextButton(
onClick = { isPasswordVisible = !isPasswordVisible },
modifier = Modifier.weight(0.3f),
) {
Text(if (isPasswordVisible) "Hide" else "Show")
}
}
// 4. Uri Input (Prominent '/' and '.com' keys, auto-capitalization disabled)
OutlinedTextField(
state = urlState,
label = { Text("Homepage URL") },
keyboardOptions =
KeyboardOptions(
keyboardType = KeyboardType.Uri,
capitalization = KeyboardCapitalization.None,
imeAction = ImeAction.Next,
),
lineLimits = TextFieldLineLimits.SingleLine,
modifier = Modifier.fillMaxWidth(),
)
// 5. PostalAddress Input (Auto-Capitalizes Words, prompts standard shipping keys)
OutlinedTextField(
state = addressState,
label = { Text("Shipping Address") },
keyboardOptions =
KeyboardOptions(
keyboardType = KeyboardType.PostalAddress,
capitalization = KeyboardCapitalization.Words,
imeAction = ImeAction.Next,
),
lineLimits = TextFieldLineLimits.SingleLine,
modifier = Modifier.fillMaxWidth(),
)
// 6. Free-Text Biography Input (Auto-Capitalizes Sentences, multi-line active)
OutlinedTextField(
state = biographyState,
label = { Text("Biography") },
keyboardOptions =
KeyboardOptions(
keyboardType = KeyboardType.Text,
capitalization = KeyboardCapitalization.Sentences,
imeAction =
ImeAction.Done, // Soft keyboard automatically dismisses keyboard on Done
),
modifier = Modifier.fillMaxWidth(),
)
}
}
/**
* A register cashier checkout panel sample. Shows how to build secure cashier PIN rows, automatic
* dollar currency amounts input formatters, integer item quantities, customer phone dialers, and
* capitalized promo voucher entry lines.
*/
/**
* A standard login form with email and password text fields. Auto-capitalization and autocorrect
* are disabled to make it easier to type credentials. Uses standard default IME actions to
* automatically move focus on Next and Done.
*/
@Sampled
@Composable
fun BasicLoginFormSample() {
val emailState = rememberTextFieldState()
val passwordState = rememberTextFieldState()
Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
OutlinedTextField(
state = emailState,
label = { Text("Email Address") },
keyboardOptions =
KeyboardOptions(
keyboardType = KeyboardType.Email,
capitalization = KeyboardCapitalization.None,
imeAction =
ImeAction
.Next, // Soft keyboard automatically shifts focus to password field on
// Next
),
lineLimits = TextFieldLineLimits.SingleLine,
modifier = Modifier.fillMaxWidth(),
)
OutlinedSecureTextField(
state = passwordState,
label = { Text("Password") },
keyboardOptions =
KeyboardOptions(
keyboardType = KeyboardType.Password,
capitalization = KeyboardCapitalization.None,
imeAction =
ImeAction.Done, // Soft keyboard automatically dismisses the keyboard on Done
),
modifier = Modifier.fillMaxWidth(),
)
}
}
/**
* A masked 4-digit PIN entry row (like a lockscreen PIN pad). Uses customized cell box borders that
* mask typed digits with dots.
*
* Demonstrates using [BasicSecureTextField] to implement custom cell-by-cell decoration.
*/