我的html文件是
<p>
<font size="4"><b>
If you do not hava a user name and password please contact
your sales representative. If you've forget your login infomation
or require assistance please email
<a href="mailto:support@tpinformation.com">support@tpinformation.com</a>
or contact our help desk.
<br/>
<br/>
</b></font>
</p>
<p>
<font size="3"><b>
EMEA +44(0)5764 3344 22333<br/>
Americas +1800 564 7667<br/>
China +88 9 4848 39844<br/>
<br/>
</b></font>
</p>
设置TextView 的URL链接地址颜色以及触发事件方法
public void setTextViewHtmlLink(TextView tv , String assertHtmlFile){
String htmltxt = null;
try{
if (htmltxt == null) {
InputStream is = this.getAssets().open(assertHtmlFile,AssetManager.ACCESS_BUFFER);
htmltxt = new String(Util.IS2ByteArray(is));
}
tv.setText(Html.fromHtml(htmltxt));
tv.setMovementMethod(LinkMovementMethod.getInstance());
CharSequence text = tv.getText();
if (text instanceof Spannable){
int end = text.length();
Spannable sp = (Spannable)tv.getText();
URLSpan[] urls = sp.getSpans( 0 , end, URLSpan.class );
SpannableStringBuilder style = new SpannableStringBuilder(text);
style.clearSpans(); // should clear old spans
for (URLSpan url : urls){
MyURLSpan myURLSpan = new MyURLSpan(url.getURL());
style.setSpan(myURLSpan,sp.getSpanStart(url),sp.getSpanEnd(url),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
style.setSpan(new ForegroundColorSpan(Color.rgb(244, 115, 33)), sp.getSpanStart(url),sp.getSpanEnd(url),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// style.setSpan(new BackgroundColorSpan(Color.rgb(244, 115, 33)), sp.getSpanStart(url),sp.getSpanEnd(url),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
tv.setText(style);
}
}catch(Exception e){
tv.setText("");
}
}
private class MyURLSpan extends ClickableSpan {
private String mUrl;
MyURLSpan(String url) {
mUrl = url;
}
@Override
public void onClick(View widget) {
// Toast.makeText(LoginActivity.this, mUrl, Toast.LENGTH_LONG).show();
//send intent
// widget.setBackgroundColor(Color.parseColor("#00000000"));
Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.setType("text/html");
sendIntent.putExtra(Intent.EXTRA_EMAIL, new String[]{mUrl});
sendIntent.putExtra(Intent.EXTRA_SUBJECT, "Get the Tullett Support");
LoginActivity.this.startActivity(Intent.createChooser(sendIntent, "Email via:"));
}
}
不知道为什么tv.setMovementMethod(LinkMovementMethod.getInstance()); 没有这句话,url颜色不变,触发事件也没有。
查了下,android的textview是支持混排的,比如下面这样, text是一个TextView String str = "someone: hi, ^O^"; SpannableStringBuilder style = new SpannableStringBuilder(str); style.setSpan(new StyleSpan(Typeface.BOLD), 0, name.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); text.setText(style, TextView.BufferType.SPANNABLE); 当我觉得很简单时,测试时发现杯具了,英文没问题,但是当要粗体的是中文时,就不起作用了。 google了下,发现android的中文加粗是要用下面的方法 T_T text.getPaint().setFakeBoldText(true); 但是这个是对整个TextView起作用的,所以全变粗了! 于是,我想出一个比较狗的办法: 搞2个TextView, 一个是粗体的文字TextView A,然后一个是全部文字 TextView B。然后把A叠加在B之上。而且,对于B的,要需要粗体那部分文字单独设成透明的颜色。这样做的目的,是用透明的文字把左边的间距顶出来,否则算这个padding也很麻烦。 所以搞算法和学术可以阳春白雪,搞工程有时不得不整奇技淫巧啊。手脏好干活啊,谁让咱们是IT民工呢 ^O^
还有相关的类 如 Linkfy ScrollingMovementMethod