最近項目中用到一個字符串後面跟着另外一個帶有點擊效果的字符串,開始用2個TextView,在一個LinearLayout佈局中水平顯示,第一個TextView正常顯示字符串,第二個TextView也顯示帶有顏色的字符串,添加了點擊效果setOnClickListener。結果發現在其他語言的情況下,第一個字符串顯示過長,會導致第二個字符串顯示部分或者不顯示,嚴重影響使用和體驗。本篇博客就是對字符串進行處理,使其中的部分字符串str2具有點擊效果。
所以將2個TextView改成一個,將字符串<string name="str1">Can\'t find?%1$s</string>,在代碼中動態的將另外一個字符串添加進去。代碼如下:
String str2 = getString(R.string.str2);
SpannableString strAll= new SpannableString(getString(R.string.str1,str2));//對str1和str2進行拼接
int i = strAll.toString().indexOf(str2); //得到str2開始的位置
strAll.setSpan(new ClickSpanOpen(this), i, i + str2.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //參數是:繼承ClickableSpan的類,對應效果的開始位置,對應效果的結束位置
final TextView message = (TextView) findViewById(R.id.search);
if(message == null) {
return;
}
message.setText(strAll);
message.setMovementMethod(LinkMovementMethod.getInstance());
setMovementMethod(LinkMovementMethod.getInstance());這行代碼很重要,如果沒有這行代碼,TextView中的部分字符串點擊效果就不起作用了。
public class ClickSpanOpen extends ClickableSpan {
private Context context;
public ClickSpanOpen(Context context) {
super();
this.context = context;
}
@Override
public void onClick(View widget) {
//要執行的操作
}
@Override
public void updateDrawState(TextPaint ds) {
// TODO Auto-generated method stub
super.updateDrawState(ds);
ds.setColor(context.getResources().getColor(R.color.autolink_color));//設置文本的顏色
ds.setUnderlineText(false);//超鏈接形式的下劃線,false 表示不顯示下劃線,true表示顯示下劃線
}
}
這樣就會前面字符串正常顯示,後面的字符串帶有顏色,且有點擊效果,並且會自動換行,不影響使用。