Textview Android Kotlin 中的订单列表

Posted

技术标签:

【中文标题】Textview Android Kotlin 中的订单列表【英文标题】:Order List in Textview Android Kotlin 【发布时间】:2021-08-14 23:15:34 【问题描述】:

嘿,我想在 android Kotlin 的 textview 中显示订单列表中的文本。我试过Ordered List inside an Android Textview。我尝试了它的代码,但它的错误匹配 numbertext 的高度。我将分享到目前为止我所做的代码。

NumberIndentSpan.kt

import android.graphics.Canvas
import android.graphics.Paint
import android.text.Layout
import android.text.style.LeadingMarginSpan

class NumberIndentSpan(
    private val leadWidth: Int,
    private val gapWidth: Int,
    private val index: Int
) : LeadingMarginSpan 

    override fun getLeadingMargin(first: Boolean): Int = leadWidth + gapWidth

    override fun drawLeadingMargin(
        c: Canvas?,
        p: Paint?,
        x: Int,
        dir: Int,
        top: Int,
        baseline: Int,
        bottom: Int,
        text: CharSequence?,
        start: Int,
        end: Int,
        first: Boolean,
        layout: Layout?
    ) 
        if (first) 
            val orgStyle = p!!.style
            p.style = Paint.Style.FILL
            val width = p.measureText("4.")
            c!!.drawText("$index.", (leadWidth + x - width / 2) * dir, bottom - p.descent(), p)
            p.style = orgStyle
        
    

MainActivity.kt

 val list = mutableListOf(
                "Log in Google account\n",
                "Scroll to the page\n",
                "Tap disconnect from account to logout"
            )
            var number = 1
            val builder = SpannableStringBuilder()
            for (text in list) 
                val contentStart: Int = builder.length
                builder.append(text)
                builder.setSpan(NumberIndentSpan(15, 15, number), contentStart, builder.length, 0)
                number++
            
            textView.text = builder

我想将 numbertext 放在相同的高度。如图所示,我从这段代码中得到了什么。我也遇到了格式问题,例如 1st 点和 2nd 点文本的开头不同,我想按顺序排列。我该如何解决所有这些问题。提前致谢

【问题讨论】:

使用此代码,文本格式对我来说工作正常,不知道你是如何得到这个问题的。能否也分享一下TextView XML 代码? 使用回收站视图有什么问题? 为什么不直接使用baseline进行文字绘制Y 【参考方案1】:

我遇到了同样的问题。那是因为您应用了自定义字体,并且很可能在 Y 定位期间没有考虑额外的行距。

这是我的工作解决方案:https://gist.github.com/marcelpallares/ae6285ee0dcb3f04493991dcb18d01bd

class NumberIndentSpan(
    private val number: Int,
    private val leadWidth: Int = 15,
    private val gapWidth: Int = 30,
) : LeadingMarginSpan 
    override fun getLeadingMargin(first: Boolean): Int 
        return leadWidth + gapWidth
    

    override fun drawLeadingMargin(
        canvas: Canvas,
        paint: Paint,
        x: Int,
        dir: Int,
        top: Int,
        baseline: Int,
        bottom: Int,
        t: CharSequence?,
        start: Int,
        end: Int,
        first: Boolean,
        layout: Layout?
    ) 
        if (first) 
            val text = "$number."
            val width = paint.measureText(text)

            val yPosition = baseline.toFloat()
            val xPosition = (leadWidth + x - width / 2) * dir

            canvas.drawText(text, xPosition, yPosition, paint)
        
    

【讨论】:

以上是关于Textview Android Kotlin 中的订单列表的主要内容,如果未能解决你的问题,请参考以下文章

java.lang.IllegalStateException: TextView 不能为空 (Android/Kotlin)

尝试在 recyclerview kotlin 上的空对象引用上调用虚拟方法 'void android.widget.TextView.setText(java.lang.CharSequence)

kotlin编《第一行代码》

如何在 Android 的 TextView 中显示 Unicode 字符?

android kotlin 中的 http 请求

工具栏中的问题设置颜色(android-kotlin)