Кнопка «Запретить перекрытие текста» в Compose Android
Я создал представление, как показано ниже:
@Composable
fun DynamicMessageBanner(
title: String,
message: String,
clickableText: AnnotatedString,
onClickableTextClicked: () -> Unit,
onCloseClicked: () -> Unit
) {
Card(
modifier = Modifier
.fillMaxWidth()
.border(width = 1.dp, color = UIBlue, shape = RoundedCornerShape(size = 4.dp)),
backgroundColor = UIBlue20,
shape = RoundedCornerShape(4.dp),
elevation = 0.dp
) {
Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End) {
Box(contentAlignment = Alignment.TopEnd) {
IconButton(onClick = onCloseClicked) {
Icon(
painterResource(id = R.drawable.ic_cross), null,
modifier = Modifier
.width(24.dp)
.height(24.dp),
tint = Color.Unspecified
)
}
}
}
Column(
modifier = Modifier
.fillMaxWidth()
.padding(12.dp, 0.dp)
) {
Spacer(modifier = Modifier.height(12.dp))
Text(text = title, style = MercuryTheme.typography.headline50)
Spacer(modifier = Modifier.height(12.dp))
Text(
text = message,
style = MercuryTheme.typography.paragraph500Medium,
)
Spacer(modifier = Modifier.height(8.dp))
ClickableText(
modifier = Modifier.align(Alignment.Start),
text = clickableText,
style = MercuryTheme.typography.paragraph400Medium,
) {
onClickableTextClicked()
}
Spacer(modifier = Modifier.height(12.dp))
}
}
}
Проблема, с которой я столкнулся на данный момент, заключается в том, что текст заголовка будет перекрывать кнопку X в правом углу, если текст слишком длинный. Есть ли какая-либо передовая практика создания такого вида представления с добавлением кнопки в верхний правый угол перед созданием текста?
В настоящее время вид выглядит следующим образом (кнопка перекрытия текста в правом верхнем углу):
Спасибо.
2 ответа
Удалите контейнер Box, содержащий ваш значок. В этом нет необходимости. horizontalArrangement
в вашем ряду также может быть ненужным.
Переместите столбец внутри строки перед значком. Вместо.fillMaxWidth()
в вашей колонке, дайте ей.weight(1f)
.
Строки, столбцы и блоки — это контейнеры для других вещей. Ваша строка сообщает вам, что элементы внутри нее расположены рядом. Поместив столбец первым в строке, вы поместите этот столбец слева от значка. Придавая ему вес 1, вы говорите, что он будет занимать больше всего места.
Вы хотите поместить заголовок так же, как и установитьweight
на егоmodifier
.
СюдаIcon
будет иметь статический размер иText
ибо заголовок заполнит все остальное.
Почему он закрывает значок — pre-Material3Card
имеетBoxScope
(«FrameLayout
").
Column
иRow
как есть.fillMaxWidth()
поэтому они оба заполняют пространство.
@Composable
fun DynamicMessageBanner(
title: String,
message: String,
clickableText: AnnotatedString,
onClickableTextClicked: () -> Unit,
onCloseClicked: () -> Unit
) {
Card() {
Column(
modifier = Modifier
.fillMaxWidth()
.padding(12.dp, 0.dp)
) {
Spacer(modifier = Modifier.height(12.dp))
Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.End) {
Text(modifier = Modifier.weight(1f), text = title, style = MaterialTheme.typography.headlineLarge)
Box(contentAlignment = Alignment.TopEnd) {
IconButton(onClick = onCloseClicked) {
}
}
}
Spacer(modifier = Modifier.height(12.dp))
Text(text = message, style = MaterialTheme.typography.bodyMedium)
Spacer(modifier = Modifier.height(8.dp))
ClickableText() {
onClickableTextClicked()
}
Spacer(modifier = Modifier.height(12.dp))
}
}
}