安卓中文本视图TextView的扩展使用

本文探讨了在使用ListView与TextView时,遇到的文本过长导致的展示问题,通过调整TextView的属性及自定义监听器,实现了在文本超出指定行数后自动截断并添加链接,同时提供了文本部分变色及点击跳转的功能。重点解决了ListView滚动时全局布局失效导致的部分TextView修剪无效的问题,通过重复调用修剪字符串的方法避免了布局完成前的角标越界异常。

最近碰到一个问题,listView的填充使用了textView,如果textView 的文本长度很长,展现会出现很大的问题,这个时候就想控制下textview的长度,如果超过2行就修改成...加一个链接去跳转。

虽然textview的属性中maxLines 和ellipsize结合使用也会达到这个效果,但是尾部不能加上自定义链接还是不太实用,这个时候网络有人给出的方法可以基本轻松解决,那就是获得viewTreeObserver然后添加一个监听器,在布局完成后,得到第二行最后一个字符的角标,然后修剪这个textView的字符串。



这是个很好的方法,但是在和Listview搭配使用的时候会出现部分失效的问题。比如,页面可见的只有两个条目,那个第三个条目设置无效,照样还会很长。

翻看log日志

发现在listView滚动的时候globleLayout没有再执行了,导致在布局初始化时没有绘制的item无法调用方法去修剪textView,而viewHolder的复用使得这种没有修剪的textView周期性的出现在列表中,如下图

比如我的事例中,初始化时只有前两条可见,那么第3 6 9条的修剪是不起作用,其他的由于复用了viewholder因此可以起效。

经过多次试验终于解决这种bug,先上图

可以看到,我在这里重复调用了修剪字符串的方法,只是加了一个lineEndIndex!=0这个判断条件,这样避免了在第一次重复调用时,由于视图树没有布局完成导致修剪字符串时出现(0-8 = -8)从而角标越界异常导致程序崩溃,

当然这个字段只在第一次布局时起作用,然后我们给lineEndIndex赋值后就没有这个角标越界问题。

至于文本部分变色,使用了html对象的方法,“<font color=\"#ff0000\">[详细]</font>”这个字符串经过html解析后在屏幕上就可以使“[详细]”显示为对应的ff0000颜色。

当然textView的方法远不止这些,我们也可以在其中添加一些其他字段使其能够部分点击,并跳转

<![CDATA[<div><br />作者:<a href="https://xxx.com">可点击文字</a><br /></div>]]>

并在代码中添加textView.setMovementMethod(LinkMovementMethod.getInstance());
tvAbout.setText(Html.fromHtml(上面的string)),就可以实现点击指定的字跳转到浏览器,请访问href中定义的网址,上图:

点击后效果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值