在跨度中隐藏字符串内容



我的 EditText带有内容: @<m id="36c03920-f411-4919-a175-a5b1eb616592">Full name</m>, how are you doing?。我想对用户使用id隐藏标签,并在显示文本时仅保留@Full name, how are you doing?。仍然getText应返回完整内容。

我发现ReplacementSpan对此方法有用。在第一步,尝试仅替换</m>,但文本以两行绘制两次。第一行以@开头,第二行从<开始。也无法插入新文本。getSize被称为多次,draw称为两次。

我的方法正确吗?我应该尝试在单独的集合中找到不同的解决方案并存储ID,并在getText()上进行后处理?

代码:

    inner class RemoveTagSpan : ReplacementSpan() {
        private val regexEndTag = Regex("</m>")
        override fun draw(canvas: Canvas, text: CharSequence?, start: Int, end: Int, x: Float, top: Int, y: Int, bottom: Int, paint: Paint) {
            text?.replace(regexEndTag, "")?.let { canvas.drawText(it, start, it.length - 1, x, y.toFloat(), paint) }
        }
        override fun getSize(paint: Paint, text: CharSequence?, start: Int, end: Int, fm: FontMetricsInt?): Int {
            return text?.replace(regexEndTag, "")?.let { paint.measureText(it).roundToInt() } ?: 0
        }
    }

不确定这是否会给您确切想要的东西,但是通常可以以这种方式完成文本视图或EditText(?(的标记语言:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    textView.setText(Html.fromHtml("@<m id="36c03920-f411-4919-a175-a5b1eb616592">Full name</m>, how are you doing?", Html.FROM_HTML_MODE_COMPACT));
} else { 
    textView.setText(Html.fromHtml("@<m id="36c03920-f411-4919-a175-a5b1eb616592">Full name</m>, how are you doing?")); 

最新更新