千家信息网

Android中TextView怎么动态设置缩进距离

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本文小编为大家详细介绍"Android中TextView怎么动态设置缩进距离",内容详细,步骤清晰,细节处理妥当,希望这篇"Android中TextView怎么动态设置缩进距离"文章能帮助大家解决疑惑
千家信息网最后更新 2026年11月01日Android中TextView怎么动态设置缩进距离

本文小编为大家详细介绍"Android中TextView怎么动态设置缩进距离",内容详细,步骤清晰,细节处理妥当,希望这篇"Android中TextView怎么动态设置缩进距离"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

需求是需要在TextView前端加入一个标签展示。

最终效果图如下:

根据效果图,很容易就能想到使用SpannableStringBuilder,在这里使用到的就是LeadingMarginSpan这个类了。

官方说明: A paragraph style affecting the leading margin. There can be multiple leading margin spans on a single paragraph; they will be rendered in order, each adding its margin to the ones before it. The leading margin is on the right for lines in a right-to-left paragraph.

LeadingMarginSpans should be attached from the first character to the last character of a single paragraph.

简单说,就是设置段落的缩进距离。

相关API使用:

val spannableString = SpannableString(text)val what = LeadingMarginSpan.Standard(width, 0)spannableString.setSpan(what, 0, spannableString.length, SpannableString.SPAN_INCLUSIVE_INCLUSIVE)

LeadingMarginSpan是接口,内部的Standard是它的标准实现方式。有两个构造方法,Standard(int every)和Standard(int first, int rest)。Standard(int every)是给每一行都设置同样的缩进距离,而Standard(int first, int rest)是给第一行和其他行分别设置缩进距离。我们这里使用的就是Standard(int first, int rest)实现方式了。 接下来setSpan方法,如果有使用过其他的ForegroundColorSpan、AbsoluteSizeSpan等span就不陌生了。传入四个参数,第一个参数就是创建出来的Span,第二个参数和第三个参数为Span作用的范围,第四个参数表示是否包含前后边界,INCLUSIVE就是表示包含边界,EXCLUSIVE就是不包含边界了。

知道了怎么设置缩进距离之后,接下去就是要获取到标签的宽度。标签是View,只有在View渲染完成之后才能获取到准确的宽度。这里使用的方法就是获取到标签View的viewTreeObserver,然后addOnPreDrawListener,需要注意获取到宽度之后就及时removeOnPreDrawListener。具体实现如下:

class MainActivity2 : AppCompatActivity() {    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_main)        val tv1 = findViewById(R.id.tv1)        val tv2 = findViewById(R.id.tv2)        tv1.text = "New"        calculateTag(tv1, tv2, "This is a long long long long title")    }    //动态设置缩进距离    fun calculateTag(tag: TextView, title: TextView, text: String?) {        val observer = tag.viewTreeObserver        observer.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener {            override fun onPreDraw(): Boolean {                val spannableString = SpannableString(text)                val what = LeadingMarginSpan.Standard(tag.width + dip2px(this@MainActivity2, 3.0), 0)                spannableString.setSpan(                    what,                    0,                    spannableString.length,                    SpannableString.SPAN_INCLUSIVE_INCLUSIVE                )                title.text = spannableString                tag.viewTreeObserver.removeOnPreDrawListener(                    this                )                return false            }        })    }    fun dip2px(context: Context, dpValue: Double): Int {        val density: Float = context.resources.displayMetrics.density        return (dpValue * density + 0.5).toInt()    }}

布局文件:

                        

读到这里,这篇"Android中TextView怎么动态设置缩进距离"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

就是 参数 动态 标签 宽度 文章 方法 边界 一行 内容 效果 效果图 方式 妥当 陌生 接下来 三个 两个 作用 前端 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技官网 奇酷互联网科技公司 九亚互联网科技 广州凡科互联网科技 沃里互联网科技 哈尔滨新华互联网科技 温州喔噻互联网科技有限公司 团飞科技与伯堂互联网服务平台 互联网科技创新服务 来此购互联网科技有限公司 知域互联网科技有限公司大骗子 互联网科技与大数据专业 本届互联网博览会上的黑科技 威龙国际互联网科技公司 玉溪新华互联网科技好不好 四川慕妮娅互联网科技有限公司 互联网金融科技名词解释 云南互联网科技学费 张家口科技产业互联网平台 恒生科技互联网指数十大成分股 互联网科技公司的优势 北京互联网科技有限公司 猪兼强互联网科技 云电互联网科技 智慧科技互联网 睿民互联网科技 成都仁贤领冠互联网科技有限公司 互联网巨头投资的硬核科技 注册互联网科技公司经营范围大全 浙南科技城互联网大厦建设工程
0