寫在前面的話
對(duì)于TextView,我想大家都已經(jīng)熟的不能再熟了。但是它的用法我們真的熟么握巢?
TextView設(shè)置基礎(chǔ)
字符串資源里變量替換
Android開發(fā)中是拒絕硬編碼的,我們可能會(huì)把一些字符串放在xml中當(dāng)作資源使用群凶,假設(shè)有如下情況:
<string name="welcome">你好A钳恕,歡迎使用我們的App。</string>
我們?cè)诔绦蛑行枰褂眠@個(gè)字符串莹规,但是A是一個(gè)變量赔蒲,很常規(guī)的辦法是取出這個(gè)字符串,然后用String的replace方法把A替換成用戶的昵稱访惜。
其實(shí)嘹履,在android中有這樣一個(gè)東西,那就是 XLIFF债热,全稱叫 XML 本地化數(shù)據(jù)交換格式砾嫉,英文全稱 XML Localization Interchange File Format。
用法也是很簡(jiǎn)單的窒篱,如
<string name="welcome">你好%1$s焕刮,歡迎使用我們的App。</string>
程序中只要給變量賦值就可以了墙杯,如
String welcome = getString(R.string.welcome, "小丸子");
把字符串打印出來如下
這里的1代表第一個(gè)變量配并,多個(gè)變量的話依次遞增即可。
TextView中設(shè)置多種字體大小
比如在項(xiàng)目中經(jīng)常遇到如下UI高镐,
像這樣的兩種字體大小放到一個(gè)TextView中溉旋,我們應(yīng)該如何處理呢?需要用到 android.text 命名空間下的一些與 spannable相關(guān)的類和接口嫉髓。如下:
String text = "您已經(jīng)連續(xù)走了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);
代碼中的設(shè)置方式:setAutoLinkMask(int)观腊。
參數(shù)和上邊列表對(duì)應(yīng),分別為:Linkify.WEB_URLS算行,Linkify.EMAIL_ADDRESSES梧油,Linkify.PHONE_NUMBERS,Linkify.MAP_ADDRESSES州邢,Linkify.ALL
但是需要注意的是儡陨,當(dāng)我們需要定制超鏈接的跳轉(zhuǎn)時(shí)應(yīng)該怎么做?答案是還是選擇Spannable量淌。代碼如下:
//將TextView的顯示文字設(shè)置為SpannableString
testText.setText(getClickableSpan());
//設(shè)置該句使文本的超連接起作用
testText.setMovementMethod(LinkMovementMethod.getInstance());
//設(shè)置超鏈接文字
private SpannableString getClickableSpan() {
SpannableString spanStr = new SpannableString("使用該軟件骗村,即表示您同意該軟件的使用條款和隱私政策");
//設(shè)置下劃線文字
spanStr.setSpan(new UnderlineSpan(), 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//設(shè)置文字的單擊事件
spanStr.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
startActivity(new Intent(MainActivity.this, UsageActivity.class));
}
}, 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//設(shè)置文字的前景色
spanStr.setSpan(new ForegroundColorSpan(Color.GREEN), 16, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//設(shè)置下劃線文字
spanStr.setSpan(new UnderlineSpan(), 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//設(shè)置文字的單擊事件
spanStr.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
startActivity(new Intent(MainActivity.this, PrivacyActivity.class));
}
}, 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//設(shè)置文字的前景色
spanStr.setSpan(new ForegroundColorSpan(Color.GREEN), 21, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return spanStr;
}
運(yùn)行效果如下圖:
實(shí)現(xiàn)點(diǎn)擊文字打電話,發(fā)郵件,跳轉(zhuǎn)網(wǎng)頁,發(fā)短信,發(fā)彩信,看地圖
testText2.setText(getClickableSpan());//設(shè)置該句使文本的超連接起作用
testText2.setMovementMethod(LinkMovementMethod.getInstance());
private SpannableString getClickableSpan() {
//tv_test2=他們叫我富文本,我能打電話,發(fā)郵件,跳轉(zhuǎn)網(wǎng)頁,發(fā)短信,發(fā)彩信,看地圖,怕了吧,嘻嘻
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); //網(wǎng)絡(luò)
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); //地圖
// 設(shè)置下劃線文字
spanStr.setSpan(new UnderlineSpan(), 35, 38, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spanStr.setSpan(new AbsoluteSizeSpan(20,true), 35, 38, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//設(shè)置文字的單擊事件
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/