Как передать значки материалов для Android в textField
Я хочу использовать значки материалов в качестве аргумента, передавая его текстовому полю.
@Composable
fun NormalTextField(
icon: () -> Unit, // how to pass material icon to textField
label: String
) {
val (text, setText) = mutableStateOf("")
TextField(
leadingIcon = icon,
value = text,
onValueChange = setText,
label = label
)
}
3 ответа
Аргумент leadIcon для texfield - это компонуемая функция (также метка), поэтому один из способов сделать это:
@Composable
fun Example() {
NormalTextField(label = "Email") {
Icon(
imageVector = Icons.Outlined.Email,
contentDescription = null
)
}
}
@Composable
fun NormalTextField(
label: String,
Icon: @Composable (() -> Unit)
) {
val (text, setText) = mutableStateOf("")
TextField(
leadingIcon = Icon,
value = text,
onValueChange = setText,
label = { Text(text = label) }
)
}
Это можно сделать с помощью InlineTextContent . Вот пример того, как вставить значок в начало текста. Вы можете обернуть это в другой составной объект, если хотите просто передать значок в качестве параметра.
Text(text = buildAnnotatedString {
appendInlineContent("photoIcon", "photoIcon")
append("very long breaking text very long breaking text very long breaking text very long breaking text very long breaking text")
}, inlineContent = mapOf(
Pair("photoIcon", InlineTextContent(
Placeholder(width = 1.7.em, height = 23.sp, placeholderVerticalAlign = PlaceholderVerticalAlign.TextTop)
) {
Image(
painterResource(R.drawable.ic_cameraicon),"play",
modifier = Modifier.fillMaxWidth().padding(end = 10.dp),
alignment = Alignment.Center,
contentScale = ContentScale.FillWidth)
}
)), lineHeight = 23.sp, color = Color.White, fontFamily = HelveticaNeue, fontSize = 18.sp, fontWeight = FontWeight.Medium)
Результат будет выглядеть так:
Как показал @Nando, используяImage
, вы можете сделать то же самое, используяIcon
из пользовательского интерфейса материала.
Text(text = buildAnnotatedString {
appendInlineContent("icon", "icon")
append(text)
},
inlineContent = mapOf(
Pair("icon", InlineTextContent(
Placeholder(
width = 1.7.em,
height = 23.sp,
placeholderVerticalAlign = PlaceholderVerticalAlign.TextTop
)
) {
Icon(
Icon(Icons.Rounded.Person),
contentDescription = null,
tint = Color.Blue
)
}
)),
lineHeight = 23.sp,
fontSize = 14.sp,
fontWeight = FontWeight.Normal)