动态更改 clickableText 上的 textDecoration android 撰写
dynamically change textDecoration on clickableText android compose
我有大量的文字排成一列,我想让每一个都在按下时改变文字装饰
(因此用户可以注意到已经选择了哪个 text/tag)
(未选择:TextDecoration.None,已选择:TextDecoration:带下划线)
(用户可以按选定的文本取消选择)
var tagsSelected = mutableListOf<String>()
...
Text(text = "tech",
Modifier.clickable {
if (tagsSelected.contains("tech")) {
tagsSelected.remove("tech")
// RemoveTextDecoration ?
} else {
tagsSelected.add("tech")
// AddTextDecoration ?
}
}.padding(5.dp))
...
我尝试过使用变量(这不是一个好主意,因为它需要很多变量),使用布尔值的可变数组(稍后观察为状态)并且 none 带来了结果对我来说,
我们将不胜感激,
谢谢:)
您正在为每个重组创建一个新的 mutableListOf
。这就是为什么没有保存新值的原因。看看你应该如何 store state in compose.
rememberSaveable
即使在屏幕旋转后也会保存您的状态(与 remember
不同),mutableStateListOf
是可变列表的变体,它将通知 Compose 有关更新。我即使离开屏幕再回来也需要保存状态,请查看 view models.
您还可以将 add/remove 逻辑移动到扩展中,这样您的代码看起来会更清晰:
fun <E> MutableList<E>.addOrRemove(element: E) {
if (!add(element)) {
remove(element)
}
}
最终变体:
val tagsSelected = rememberSaveable { mutableStateListOf<String>() }
Text(
text = "tech",
modifier = Modifier
.clickable {
tagsSelected.addOrRemove("tech")
}
.padding(5.dp)
)
如果您有许多看起来相同的 Text
项,您可以使用 forEach
:
重复它们
val tagsSelected = rememberSaveable { mutableStateListOf<String>() }
val items = listOf(
"tech1",
"tech2",
"tech3"
)
items.forEach { item ->
Text(
text = item,
modifier = Modifier
.clickable {
tagsSelected.addOrRemove(item)
}
.padding(5.dp)
)
}
如果您只需要使用选择状态来更改文本装饰,您可以轻松地将其移动到其他可组合项并创建局部变量:
@Composable
fun ClickableDecorationText(
text: String,
) {
var selected by rememberSaveable { mutableStateOf(false) }
Text(
text = text,
textDecoration = if(selected) TextDecoration.Underline else TextDecoration.None,
modifier = Modifier
.clickable {
selected = !selected
}
.padding(5.dp)
)
}
我有大量的文字排成一列,我想让每一个都在按下时改变文字装饰
(因此用户可以注意到已经选择了哪个 text/tag)
(未选择:TextDecoration.None,已选择:TextDecoration:带下划线)
(用户可以按选定的文本取消选择)
var tagsSelected = mutableListOf<String>()
...
Text(text = "tech",
Modifier.clickable {
if (tagsSelected.contains("tech")) {
tagsSelected.remove("tech")
// RemoveTextDecoration ?
} else {
tagsSelected.add("tech")
// AddTextDecoration ?
}
}.padding(5.dp))
...
我尝试过使用变量(这不是一个好主意,因为它需要很多变量),使用布尔值的可变数组(稍后观察为状态)并且 none 带来了结果对我来说,
我们将不胜感激,
谢谢:)
您正在为每个重组创建一个新的 mutableListOf
。这就是为什么没有保存新值的原因。看看你应该如何 store state in compose.
rememberSaveable
即使在屏幕旋转后也会保存您的状态(与 remember
不同),mutableStateListOf
是可变列表的变体,它将通知 Compose 有关更新。我即使离开屏幕再回来也需要保存状态,请查看 view models.
您还可以将 add/remove 逻辑移动到扩展中,这样您的代码看起来会更清晰:
fun <E> MutableList<E>.addOrRemove(element: E) {
if (!add(element)) {
remove(element)
}
}
最终变体:
val tagsSelected = rememberSaveable { mutableStateListOf<String>() }
Text(
text = "tech",
modifier = Modifier
.clickable {
tagsSelected.addOrRemove("tech")
}
.padding(5.dp)
)
如果您有许多看起来相同的 Text
项,您可以使用 forEach
:
val tagsSelected = rememberSaveable { mutableStateListOf<String>() }
val items = listOf(
"tech1",
"tech2",
"tech3"
)
items.forEach { item ->
Text(
text = item,
modifier = Modifier
.clickable {
tagsSelected.addOrRemove(item)
}
.padding(5.dp)
)
}
如果您只需要使用选择状态来更改文本装饰,您可以轻松地将其移动到其他可组合项并创建局部变量:
@Composable
fun ClickableDecorationText(
text: String,
) {
var selected by rememberSaveable { mutableStateOf(false) }
Text(
text = text,
textDecoration = if(selected) TextDecoration.Underline else TextDecoration.None,
modifier = Modifier
.clickable {
selected = !selected
}
.padding(5.dp)
)
}