写在前面的话
对于TextView,我想大家都已经熟的不能再熟了。但是它的用法我们真的熟么?
TextView设置基础
字符串资源里变量替换
Android开发中是拒绝硬编码的,我们可能会把一些字符串放在xml中当作资源使用,假设有如下情况:
<string name="welcome">你好A,欢迎使用我们的App。</string>
我们在程序中需要使用这个字符串,但是A是一个变量,很常规的办法是取出这个字符串,然后用String的replace方法把A替换成用户的昵称。
其实,在android中有这样一个东西,那就是 XLIFF,全称叫 XML 本地化数据交换格式,英文全称 XML Localization Interchange File Format。
用法也是很简单的,如
<string name="welcome">你好%1$s,欢迎使用我们的App。</string>
程序中只要给变量赋值就可以了,如
String welcome = getString(R.string.welcome, "小丸子");
把字符串打印出来如下
Paste_Image.png这里的1代表第一个变量,多个变量的话依次递增即可。
TextView中设置多种字体大小
比如在项目中经常遇到如下UI,
像这样的两种字体大小放到一个TextView中,我们应该如何处理呢?需要用到 android.text 命名空间下的一些与 spannable相关的类和接口。如下:
String text = "您已经连续走了5963步";
int start = text.indexOf('5');
int end = text.length();
Spannable textSpan = new SpannableStringBuilder(text);
textSpan.setSpan(new AbsoluteSizeSpan(16), 0, start, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
textSpan.setSpan(new AbsoluteSizeSpan(26), start, end - 1, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
textSpan.setSpan(new AbsoluteSizeSpan(16), end - 1, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
TextView textView = (TextView) findViewById(R.id.text);
textView.setText(textSpan);
代码中的设置方式:setAutoLinkMask(int)。
参数和上边列表对应,分别为:Linkify.WEB_URLS,Linkify.EMAIL_ADDRESSES,Linkify.PHONE_NUMBERS,Linkify.MAP_ADDRESSES,Linkify.ALL
但是需要注意的是,当我们需要定制超链接的跳转时应该怎么做?答案是还是选择Spannable。代码如下:
//将TextView的显示文字设置为SpannableString
testText.setText(getClickableSpan());
//设置该句使文本的超连接起作用
testText.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, UsageActivity.class));
}
}, 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置文字的前景色
spanStr.setSpan(new ForegroundColorSpan(Color.GREEN), 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, PrivacyActivity.class));
}
}, 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置文字的前景色
spanStr.setSpan(new ForegroundColorSpan(Color.GREEN), 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return spanStr;
}
运行效果如下图:
Paste_Image.png
实现点击文字打电话,发邮件,跳转网页,发短信,发彩信,看地图
testText2.setText(getClickableSpan());//设置该句使文本的超连接起作用
testText2.setMovementMethod(LinkMovementMethod.getInstance());
private SpannableString getClickableSpan() {
//tv_test2=他们叫我富文本,我能打电话,发邮件,跳转网页,发短信,发彩信,看地图,怕了吧,嘻嘻
SpannableString spanStr = new SpannableString(getString(R.string.tv_test2));
spanStr.setSpan(new URLSpan("tel:10010"), 11, 13, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//打电话
spanStr.setSpan(new URLSpan("mailto:muqingxs@google.com"), 15, 17, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //邮件
spanStr.setSpan(new URLSpan("http://www.baidu.com"), 20, 22, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //网络
spanStr.setSpan(new URLSpan("sms:10010"), 24, 26, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //短信 使用sms:或者smsto:
spanStr.setSpan(new URLSpan("mms:10010"), 28, 30, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //彩信 使用mms:或者mmsto:
spanStr.setSpan(new URLSpan("geo:31.075758,121.503256"), 32, 34, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //地图
// 设置下划线文字
spanStr.setSpan(new UnderlineSpan(), 35, 38, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spanStr.setSpan(new AbsoluteSizeSpan(20,true), 35, 38, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置文字的单击事件
spanStr.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
ToastUtils.showToast(MainActivity.this, "我好怕怕");
}
}, 35, 38, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return spanStr;
}
}
参考博客
http://blog.csdn.net/xiangzilv1987/article/details/8212064
http://android.jobbole.com/83961/
网友评论