如何在多行文本视图的最后一个字符之后放置图标

How to place an icon just after the last character of a multiline textview

提问人:Shivam Gupta 提问时间:8/30/2023 更新时间:8/31/2023 访问量:37

问:

我想在(可能)多行 TextView 的最后一个字之后找到一个视图。

例如,TextView 可能是两行,第二行的长度约为 TextView 宽度的一半。如何在最后一个单词之后找到视图。

我还想在该图标上附加一个单击侦听器。我正在使用数据绑定。
我试过spannabale琴弦。

android kotlin textview android-databinding

评论

0赞 Elango 8/30/2023
欢迎来到 stack overflow,提供一些代码,我们无法用这些行来解决,看看这个 stackoverflow.com/help/how-to-ask
0赞 Community 8/30/2023
请编辑问题,将其限制在特定问题上,并具有足够的细节以确定适当的答案。

答:

0赞 Blate 8/30/2023 #1

试试这个:

    val targetText = "A quick brown fox jumps over \n the lazy dog"
    val text: SpannableStringBuilder = SpannableStringBuilder(targetText)

    val drawable: Drawable = ContextCompat.getDrawable(this, R.mipmap.ic_launcher)!!
    drawable.setBounds(0, 0, 50, 50)

    //ImageSpan.ALIGN_BASELINE; ImageSpan.ALIGN_BOTTOM; ImageSpan.ALIGN_CENTER;
    val imageSpan: ImageSpan = ImageSpan(drawable, ImageSpan.ALIGN_BASELINE)

    val clickSpan: ClickableSpan = object : ClickableSpan() {
        override fun onClick(widget: View) {
            Toast.makeText(this@TestActivity, "click icon", Toast.LENGTH_SHORT).show()
        }
    }

    val len: Int = text.length
    text.append("\uFFFC")
    text.setSpan(imageSpan, len, text.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
    text.setSpan(clickSpan, len, text.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

    mViewBinding.tv.highlightColor = ContextCompat.getColor(this, android.R.color.transparent)
    mViewBinding.tv.movementMethod = LinkMovementMethod.getInstance()
    mViewBinding.tv.text = text

    mViewBinding.tv.setOnClickListener {
        Toast.makeText(this@TestActivity, "click text", Toast.LENGTH_SHORT).show()
    }

然后你可以得到:图片

这是你的愿望吗?

评论

0赞 Community 9/1/2023
正如目前所写的那样,你的答案尚不清楚。请编辑以添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。您可以在帮助中心找到有关如何写出好答案的更多信息。
0赞 Shivam Gupta 8/31/2023 #2

我实现了这个功能。

看一看

@BindingAdapter("yourTAG")
fun setText(textView: TextView, text: SpannableString?) {
    textView.movementMethod = LinkMovementMethod.getInstance()
    if (!text.isNullOrBlank()) {
        textView.text = text
    }

然后在 viewModel 中创建此函数

private fun getSpannable(text:CharSequence): SpannableString{
        val icon: Drawable = resourcesService.getDrawable(R.drawable.your_icon)

        val spannableString = SpannableString(text)
        val position = spannableString.length-1
        icon.setBounds(0, 0, icon.intrinsicWidth, icon.intrinsicHeight)
        val imageSpan = ImageSpan(icon, ImageSpan.ALIGN_BASELINE)

        spannableString.setSpan(imageSpan, position, position +1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
        val clickableSpan = object : ClickableSpan() {
            override fun onClick(widget: View) {
                //TODO
            }
        }
        spannableString.setSpan(clickableSpan, position, position + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
        return spannableString
    }

var myField = getSpannable("Thank you Stackoverflow")

在您的视野中

app:yourTAG="@{vm.myField}"

}