写在前面的话(特别声明)
本文仅是本人自己学习的总结笔记,参考网上多篇文章,本人仅做了必要的总结和效果展示。
方法一:设置autoLink
autoLink:一共有以下几种值:web,phone,map,email,all,none。
分别是:url连接,电话号码提取拨号,地图地址,电子邮件,全部解释就是能支持的超级连接全部起作用,none就是默认情况,没有超链接。
- 布局
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="15"
android:autoLink="all"//布局中使用这一句
/>
- 代码
String html = "http://www.baidu.com";
mTextView.setAutoLinkMask(Linkify.ALL);//布局中设置android:autoLink 后这一句就不需要了
mTextView.setText(html);
- 演示效果
- Tips
上述代码中的网址,可以不加http://,也能被系统识别出来
方法二:通过HTML格式化网址
- 布局
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="15"/>
- 代码
String html = "有问题:\n";
html += "<a href='http://www.baidu.com'>百度一下</a>";
mTextView.setMovementMethod(LinkMovementMethod.getInstance());
mTextView.setText(Html.fromHtml(html));
- 演示效果
- Tips
1、之前方法一布局中的android:autoLink="all" 必须去掉,代码中也不能使用mTextView.setAutoLinkMask(Linkify.ALL),否则识别不出来网址,也就是说两种方法切忌混着用。
2、注意这里必须加上协议号,即http://。否则,系统会以为该链接是activity,而实际这个activity不存在,程序就崩溃。
FATAL EXCEPTION: main
Process: com.bohe.coolweather, PID: 4519
android.content.ActivityNotFoundException: No Activity found to handle Intent
{ act=android.intent.action.VIEW dat=www.baidu.com (has extras) }
3、
mTextView.setMovementMethod(LinkMovementMethod.getInstance());
必须有上面这一句,否则识别不出超链接。
setMovementMethod,此方法在需要响应用户事件时使用,如点击一个电话号码就跳转到拨号页面。如果不执行这个方法是不会响应事件的,即便文本看着已经是下划线字了。
当一段文字部分是超链接或者我们需要点击超链接跳到另一个Activity时,如何处理?答案还是用Spannable。
- 代码
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView mTextView = (TextView) findViewById(R.id.text);
//将TextView的显示文字设置为SpannableString
mTextView.setText(getClickableSpan());
//设置该句使文本的超连接起作用
mTextView.setMovementMethod(LinkMovementMethod.getInstance());
}
//设置超链接文字
private SpannableString getClickableSpan() {
SpannableString spanStr = new SpannableString("使用该软件,即表示您同意该软件的使用条款和隐私政策");
//设置下划线文字
spanStr.setSpan(new UnderlineSpan(), 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置文字的单击事件
spanStr.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
startActivity(new Intent(MainActivity.this, TestActivity1.class));
}
}, 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置文字的前景色
spanStr.setSpan(new ForegroundColorSpan(Color.RED), 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置下划线文字
spanStr.setSpan(new UnderlineSpan(), 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置文字的单击事件
spanStr.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
startActivity(new Intent(MainActivity.this, TestActivity2.class));
}
}, 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置文字的前景色
spanStr.setSpan(new ForegroundColorSpan(Color.BLUE), 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return spanStr;
}
- 演示效果
- Tips
1、设置文字的单击事件——此操作会默认给有单击效果的文字加上下划线和默认颜色(具体颜色因主题不同而不同); 当然,之所以会有默认的颜色和下划线,是因为ClickableSpan类中的updateDrawState(TextPaint ds)这个方法,如果你想去掉下划线或者改变默认颜色,可重写该方法或者使用2、3中的操作
/**
* Makes the text underlined and in the link color.
*/
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(ds.linkColor);
ds.setUnderlineText(true);
}
2、设置下划线文字——此操作就是仅仅给文字加下划线。
3、设置文字的前景色——此操作就是改变文字的前景色。但是该操作和设置文字的单击事件,两者中,后执行的会覆盖先执行的相同字段的颜色,for example,先设置[16,30)文字颜色是RED,后给[20,24)文字设点击事件,那么[20,24)的文字颜色会被默认颜色覆盖,同样反之亦然。
4、涉及到的常量解释
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;//前后都不包括()
Spanned.SPAN_EXCLUSIVE_INCLUSIVE;//前不包含后包含(]
Spanned.SPAN_INCLUSIVE_EXCLUSIVE;//前包含后不包含[)
Spanned.SPAN_INCLUSIVE_INCLUSIVE;//前后都包含[]
参考链接###
textView 添加超链接(两种实现方式)
android:TextView中的文本链接之--链接的几种方式
延伸链接###
Android TextView使用HTML处理字体样式、显示图片
值得学习###
Android实战技巧之一:文本与布局
Android textView 添加超链接(三种实现方式)
百度知道关于SpannableString用法介绍比较详细的
Google出来的第一篇博客,垃圾百度居然第一页都没有这篇文章