最近一个需求中,需要对Textview中的文本url进行高亮显示,并自定义点击操作。按照所学知识,开始码代码。
按照交互要求,Textview最多五行,自动显示省略号:
1 | <TextView |
截取文本中的url字段,设置url的span
1 | // ... |
1 | public class UrlSpanListener extends ClickableSpan { |
给Textview设置文本,并设置movementmethod使span点击操作可以执行。
1 | TextView linkText = itemView.findViewById(R.id.link_text); |
写完代码,美滋滋等待build,想着分分钟解决了需求。然鹅,事情并没有想象的那么简单!!!跑完后发现,textview中的文本,在超过五行后自动省略,但是,并没有显示省略号,文本还会莫名出现向上动了半截字的画面!!!向下面一样
在问遍组内大佬,百度半天,谷歌半天没有结果后(ps:谷歌上说,用SpannableStringBuilder文本,会导致TextView算不准什么时候显示省略号,要自己截取文本添加省略号来实现,这都是骗!人!的!),一个大佬偶然说,你这textview好像就是向上滚动了,我记得textview有个设置不可滚动的属性,你看看设为none后可不可以用。听完火速打来xml开始寻找这个属性,寻找一圈后没找到大佬说的属性,但是给了我灵感,遂谷歌如何设置textview可滚动,谷歌说textview本身自带滚动,若要实现滚动效果,给textview设置movementmethod即可。
1 | // 设置后textview便可以滚动 |
再顺藤摸瓜看了一眼,LinkMovementMethod继承自ScrollingMovementMethod,好了,自此知道了问题所在。
因为LinkMovementMethod继承自ScrollingMovementMethod,所以也继承了滚动属性,textview中的文本若可以滚动,便不会自动省略和显示省略号,又因为需求中的textview外层是recyclerview,大部分的滚动监听都被recyclerview捕获,个别触发了textview的滚动导致个别textview文字向上滚动了一点。去掉linkText.setMovementMethod(LinkMovementMethod.getInstance());后,文字可以正常省略了,也有省略号了,也不会自己滚动了,然鹅,span就不能点击了。既然这样,只好自己做点击事件了。
1 | // textview点击监听 |
自此,问题完美解决,需求完美实现~(˘▾˘)~