Android中如何获取EditText焦点所在单词并添加/移除加粗效果?
实现EditText指定单词的加粗/取消加粗效果
完全可以实现,核心是利用EditText的Spannable富文本特性,结合光标位置定位目标单词,再动态添加或移除加粗样式,具体步骤如下:
- 定位目标单词:当光标停在目标单词上时,通过光标位置向前、向后遍历文本,找到单词的起始和结束索引(以空格或文本边界为分隔)。
- 判断当前样式:获取EditText的
SpannableString内容,通过getSpans()方法检查目标单词范围内是否存在StyleSpan(Typeface.BOLD)样式。 - 切换加粗状态:如果已加粗,调用
removeSpan()移除对应的StyleSpan;如果未加粗,调用setSpan()添加加粗样式。
示例代码
以下是按钮点击事件的核心处理逻辑:
boldButton.setOnClickListener { val editText = findViewById<EditText>(R.id.your_edittext) val spannable = editText.text as Spannable val cursorPos = editText.selectionStart // 定位当前单词的start和end索引 var start = cursorPos while (start > 0 && spannable[start - 1] != ' ') { start-- } var end = cursorPos while (end < spannable.length && spannable[end] != ' ') { end++ } // 检查是否已加粗并移除现有样式 var isBold = false val existingSpans = spannable.getSpans(start, end, StyleSpan::class.java) existingSpans.forEach { span -> if (span.style == Typeface.BOLD) { isBold = true spannable.removeSpan(span) } } // 未加粗则添加样式 if (!isBold) { spannable.setSpan(StyleSpan(Typeface.BOLD), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) } }
注意事项
- 确保EditText的
inputType未设置为textPassword等不支持富文本的类型,常规text或textMultiLine均可。 - 上述代码已支持连续点击切换加粗/取消加粗状态。
内容的提问来源于stack exchange,提问作者user19516326
相关产品推荐
相关产品推荐

