TextView使用小技巧——一个TextView多重属性设置(SpannableStringBuilder)

来源:互联网 发布:qq宠物 知乎 编辑:程序博客网 时间:2024/05/18 02:00

前言
开发中我们经常会遇到这种情况,展示一条连贯的文字信息,比如一句话,但是这句话内容中有一部分属性可能跟其他部分不一致,比如字体大小、颜色或者点击事件与否。开始我们可能会想到使用多个TextView拼接,接触过的人都清楚,某些情况下或许可以,但很多情况下是行不通的,其中缘由不再细说。通过查阅,我们发现其实Android本身已经为我们的Text提供了这个功能,即一个TextView多重属性的设置功能。

举个栗子,我们有这么一个需求:欲知详情,请阅读《中华人民共和国中国共产党纪律处分条例第358章21条第5节》。要求这条内容连贯显示并将“《中华人民共和国中国共产党纪律处分条例第358章21条第5节》”显示为蓝色可点击,点击进入条例详情页面。

好了,废话不多说。
这里我们用一个TextView搞定,这里我们要用到一个类SpannableStringBuilder。我们看下官方解释:

/**
* This is the class for text whose content and markup can both be changed.
*/

翻译:这个类可以让一个文本的内容和标记改变属性。

TextView tv = new TextView();String strContent = "欲知详情,请阅读《中华人民共和国中国共产党纪律处分条例第358章21条第5节》";String strPart1 = "欲知详情,请阅读";SpannableStringBuilder ssb = new SpannableStringBuilder(strContent);ssb.setSpan(new ClickableSpan() {    @Override    public void updateDrawState(TextPaint ds) {    super.updateDrawState(ds);    //TODO 在这里设置被选中文字属性    ds.setColor(Color.BLUE);    ds.setUnderlineText(false);//默认设置是有下划线的,所以我们要设置false去掉下划线  }    @Override    public void onClick(View widget) {    // TODO 点击事件    Toast.makeText(MainActivity.this,"显示《中华人民共和国中国共产党纪律处分条例第358章21条第5节》",Toast.LENGTH_LONG).show();  }},strPart1.length(),strContent.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);tv.setText(ssb);tv.setMovementMethod(LinkMovementMethod.getInstance());

注意,最后一句(即setMoveMentMethod)一定要加上去,这是TextView上的一个方法,我们看下官方解释:

/**
* Sets the movement method (arrow key handler) to be used for
* this TextView. This can be null to disallow using the arrow keys
* to move the cursor or scroll the view.
*
* Be warned that if you want a TextView with a key listener or movement
* method not to be focusable, or if you want a TextView without a
* key listener or movement method to be focusable, you must call
* {@link #setFocusable} again after calling this to get the focusability
* back the way you want it.
*/

简单翻译一下就是说如果你对TextView设置了点击事件或者movement方法(这方法我也不清楚),就一定要调用这个方法来获取焦点,或者失去焦点。
这里我们对“《中华人民共和国中国共产党纪律处分条例第358章21条第5节》”这部分设置了点击事件,所以我们点击这部分时可以触发点击事件。

OK,最后看下效果图:

这里写图片描述