Android 在 TextView 的文本中使用图标

Android using icon in text of TextView

我想在 TextView 的文本中使用图标。 (不在它的前面或末尾。)基本的想法是一个简短的信息框,告诉用户,这些花哨的三行就是菜单。 (因为不可能在它们下面写“菜单”,除了我也想自己处理所有的点击事件。叹息) 所以我的文字应该是这样的:

现在这只是在文本视图的末尾添加了一个图标,但是你可以清楚地看到,它看起来非常丑陋,并且只适用于固定的屏幕尺寸。在横向模式下,图标将位于屏幕的另一侧,而不是文本。 因此,我正在寻找在文本中编写图标的方法。 我在考虑字符串资源或类似内容中的类似“Um das Menü zu öffnen,tippe auf @drawable/sandwich”之类的内容。 (遗憾的是,这显然不是那样工作的。)

这可能吗?或者,如果没有,是否有一些秘密技巧可以在顶部的操作栏中向三明治图标添加文本,而不创建我的自定义布局? 大约 50% 的用户无法意识到这是一个菜单,因为他们不习惯很多应用程序。

是的,您可以使用 SpannableString 来完成。请参阅以下示例:

val modifiedText = "your-text-here %icon%" // you can use resource string here
val span = SpannableString(modifiedText)
val drawable = ResourcesCompat.getDrawable(resources, R.drawable.your_image, null)
drawable?.setBounds(0, 0, drawable.intrinsicWidth, drawable.intrinsicHeight)
val image = ImageSpan(drawable, ImageSpan.BOTTOM)
val startIndex = modifiedText.indexOf("%icon%")

//Replace %icon% with drawable
span.setSpan(image, startIndex, startIndex + 6, Spannable.SPAN_INCLUSIVE_INCLUSIVE)
yourTextView.setText(span)

你可以使用 VerticalImageSpan which is an extension to ImageSpan.

并使用以下 TextView 扩展函数获取要放置可绘制对象的 TextView 中的索引;可绘制对象,所需的图像宽度和高度。

fun TextView.addDrawableAt(index: Int, @DrawableRes imgSrc: Int, imgWidth: Int, imgHeight: Int) {
    val ssb = SpannableStringBuilder(this.text)

    val drawable = ContextCompat.getDrawable(this.context, imgSrc) ?: return
    drawable.mutate()
    drawable.setBounds(
        0, 0,
        imgWidth,
        imgHeight
    )
    ssb.setSpan(
        VerticalImageSpan(drawable),
        index - 1,
        index,
        Spannable.SPAN_INCLUSIVE_EXCLUSIVE
    )
    this.setText(ssb, TextView.BufferType.SPANNABLE)
}