插入一个AnnotatedString到EditText (Jetpack Compose)



我想解决以下问题。例如,我正在写这篇文章-"你好*世界*"。例如,在我停止写作之后,过了一秒钟,单词"*world*&;"应该用"world"以粗体显示。我试过这样做,但到目前为止它不起作用。

val originalText = MutableStateFlow("")
val resultText = originalText
.debounce(1000)
.distinctUntilChanged()
.flatMapLatest { text ->
val result = formatText(text) // create AnnotatedString
flow { emit(result) }
}

并尝试插入到EditText:

val resultText by viewModel.resultText.collectAsState(AnnotatedString(""))

OutlinedTextField(
value = TextFieldValue(resultText),
onValueChange = {
viewModel.originalText.value = it.text
},
label = { Text("Description") },
modifier = Modifier
.fillMaxHeight()
.fillMaxWidth()
)

问题是我无法实现以下结果:我们将文本写入"EditText"一秒钟后,它被格式化并插入到相同的"EditText"。谁能告诉我,我该如何解决这个问题?

我找到了一个解决方案,但我很抱歉代码。这绝对值得改进。

视图模型方法:

private var _wordList = mutableListOf<String>()
val wordList = _wordList
// Remove words that are not in the string
fun updateWordList(text: String) {
_wordList.forEach {
if(!text.contains(it)) {
_wordList.remove(it)
}
}
}
fun getWords(text: String) : List<String> {
val regex = Regex("\*(.*?)[\*]")
val matches = regex.findAll(text)
return matches.map { it.groupValues[1] }.toList()
}
fun addWords(text: String) {
val words = getWords(text)
words.forEach { word ->
if(!_wordList.contains(word)) _wordList.add(word)
}
}

创建一个AnnotatedString的方法:

fun getAnnotatedString(text: String, words: List<String>): AnnotatedString = buildAnnotatedString {
append(text)
words.forEach { word ->
if (text.contains(word)) {
val offsetStart = text.indexOf(word)
val offsetEnd = offsetStart + word.length
addStyle(
style = SpanStyle(fontWeight = FontWeight.Bold),
start = offsetStart,
end = offsetEnd
)
}
}
}

之后,我们需要创建以下变量:

val words = viewModel.getWords(description)
viewModel.addWords(description)
val descResult = if (words.isEmpty()) description else description.replace("*", "")
val formattedString = formatString(descResult, viewModel.wordList)
var textFieldValueState by remember {
mutableStateOf(TextFieldValue(annotatedString = formattedString))
}
val textFieldValue = textFieldValueState.copy(annotatedString = formattedString)

最后,定义OutlinedTextField:

OutlinedTextField(
value = textFieldValue,
onValueChange = {
viewModel.updateWordList(it.text)
if (tmp == it.text) {
textFieldValueState = it
return@OutlinedTextField
}
description = it.text
textFieldValueState = it
},
label = { Text("Description") }
)

相关内容

  • 没有找到相关文章

最新更新