Как использовать вес в кнопке, чтобы выровнять текст слева и значок справа
Я создаю повторно используемый компонент Button в Jetpack Compose, который в основном представляет собойRow
. Кнопка должна иметь текст на левом конце и значок на правом конце. Это работает прямо так:
@Composable
fun MyButton(
text: String,
modifier: Modifier = Modifier
) {
Button(
onClick = { /* */ },
modifier = modifier
) { // RowScope
Text(
text = text
)
Spacer(modifier = Modifier.width(8.dp))
Icon(
painter = painterResource(
id = android.R.drawable.ic_dialog_info
),
contentDescription = null
)
}
}
Однако, если кнопка имеет фиксированную ширину, текст и значок располагаются по центру, а не слева/справа.
Поэтому я попытался добавитьmodifier = Modifier.weight(1F)
кText
поэтому он заполняет любое дополнительное пространство. Но это приводит к тому, что кнопка без фиксированной ширины занимает столько места, сколько может.
Как я могу создать компонент Compose, который работает в обоих случаях: когда определена ширина и когда он обтекает содержимое?
Мой макет экрана:
@Composable
fun MyScreen() {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier.fillMaxSize()
) {
Spacer(modifier = Modifier.height(8.dp))
MyButton(
text = "variable width",
modifier = Modifier.wrapContentWidth()
)
Spacer(modifier = Modifier.height(8.dp))
MyButton(
text = "fixed width",
modifier = Modifier.width(300.dp)
)
}
}
2 ответа
СодержаниеButton
этоRowScope
.Просто применитеweight(1f)
модификатор кText
вместе сTextOverflow.Ellipsis
.
Что-то вроде:
Button(
onClick = { /* */ },
modifier = modifier.width(IntrinsicSize.Max)
) { // RowScope
Text(
text = text,
maxLines = 1,
modifier = Modifier.weight(1f),
overflow = TextOverflow.Ellipsis
)
Spacer(modifier = Modifier.width(8.dp))
Icon(
painter = painterResource(
id = android.R.drawable.ic_dialog_info
),
contentDescription = null
)
}
Я считаю, что вам нужно установить внутреннюю ширину на вашей кнопке. Что-то вроде
Button(
onClick = { /* */ },
modifier = modifier.width(IntrinsicSize.Min)
)
См. документацию здесь, https://developer.android.com/jetpack/compose/layouts/intrinsic-measurements .