若是看到這裏說明你對 TextView 已經有了必定的瞭解,至少已經使用過該控件顯示文字過。如今來實現一些複雜一點的效果。html
咱們在APP開發過程當中會遇到這樣的需求,例如:
api
其中標記爲下劃線的爲可點擊,點擊後通常是跳轉一個網頁(這個在這裏不作討論)。面對這樣的需求裏可能已經知道TextView
是能夠添加下劃線的,你的實現多是:ide
By Login, You agree to our Privicy Policy & Terms of use [TextView]----[TextView]--[TextView]---[TextView] [By Login, You agree to our ][Privicy Policy][ & ][Terms of use]
而後爲可點擊的 TextView
添加下劃線,而後設置點擊事件就ok了。
若是你知足於這,那麼你能夠繼續日後看,看看只用一個TextView 如何實現。ui
爲了介紹 SpannableString
,咱們來用它實現一個簡單的下劃線並設置監聽點擊事件。url
String clickString = "I Love Android!"; SpannableString spannableString =new SpannableString(clickString); spannableString.setSpan(new ClickableSpan() { @Override public void onClick(View widget) { Toast.makeText(getActivity(),"Love",Toast.LENGTH_SHORT).show(); } },2,6,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); tv_tip.setText(spannableString); tv_tip.setMovementMethod(LinkMovementMethod.getInstance());
這回就要使用一個新的類:SpannableStringBuilder
。看到名字就知道,它的做用相似StringBuilder
就是把多個SpannableString
鏈接起來。
最後的效果:spa
點擊效果:code
代碼實現(關鍵點就是把多個SpannableString
鏈接起來):htm
final String linkWord1 = "Android"; final String linkWord2 = "Are you ok?"; final String linkWord3 = "think you!"; String word = "Hello " + linkWord1 + "," + linkWord2 + " I'm fine," + linkWord3; SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(word); int index1 = word.indexOf(linkWord1); int index2 = word.indexOf(linkWord2); int index3 = word.indexOf(linkWord3); spannableStringBuilder.setSpan(new ClickableSpan() { @Override public void onClick(View widget) { Toast.makeText(getActivity(), linkWord1, Toast.LENGTH_SHORT).show(); } @Override public void updateDrawState(TextPaint ds) { super.updateDrawState(ds); ds.setColor(Color.RED); //設置文件顏色 ds.setUnderlineText(true); //設置下劃線 } }, index1, index1 + linkWord1.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); spannableStringBuilder.setSpan(new ClickableSpan() { @Override public void onClick(View widget) { Toast.makeText(getActivity(), linkWord2, Toast.LENGTH_SHORT).show(); } @Override public void updateDrawState(TextPaint ds) { super.updateDrawState(ds); ds.setColor(Color.GREEN); //設置文件顏色 ds.setUnderlineText(true); //設置下劃線 } }, index2, index2 + linkWord2.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); spannableStringBuilder.setSpan(new ClickableSpan() { @Override public void onClick(View widget) { Toast.makeText(getActivity(), linkWord3, Toast.LENGTH_SHORT).show(); } @Override public void updateDrawState(TextPaint ds) { super.updateDrawState(ds); ds.setColor(Color.BLUE); //設置文件顏色 ds.setUnderlineText(false); //設置下劃線 } }, index3, index3 + linkWord3.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); tv_tip.setTextSize(14); tv_tip.setText(spannableStringBuilder); tv_tip.setMovementMethod(LinkMovementMethod.getInstance());
固然還有另一種方法,就是使用TextView
顯示 html
格式的文本,而後處理其中的url
,過程仍是相似咱們上面用到的方法,直接上代碼吧:blog
String html = "<p>\n" + " Hello <a href=\"/link/click1\">Android</a>,<a href=\"/link/click2\">Are you ok?</a>I'm fine,<a href=\"/link/click3\">think you!</a>\n" + " </p>"; tv_tip.setText(Html.fromHtml(html)); tv_tip.setMovementMethod(LinkMovementMethod.getInstance()); CharSequence text = tv_tip.getText(); if (text instanceof Spannable) { int end = text.length(); Spannable sp = (Spannable) tv_tip.getText(); URLSpan[] urls = sp.getSpans(0, end, URLSpan.class); SpannableStringBuilder style = new SpannableStringBuilder(text); style.clearSpans(); // should clear old spans for (final URLSpan url : urls) { // 設置Span style.setSpan(new ClickableSpan() { @Override public void onClick(View widget) { Toast.makeText(getActivity(), url.getURL(), Toast.LENGTH_SHORT).show(); } @Override public void updateDrawState(TextPaint ds) { super.updateDrawState(ds); ds.setColor(Color.RED); //設置文件顏色 ds.setUnderlineText(true); //設置下劃線 } }, sp.getSpanStart(url), sp.getSpanEnd(url), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } tv_tip.setText(style); }
效果圖:
由於我把全部的鏈接都設置爲紅色,因此顯示的都是紅色,實際中可能進行處理,那時對每一個url
都進行處理便可。接口
這裏我沒有講每一個類的細節,由於我以爲,若是你知道類名,那麼你能夠查到對應的官方文檔,官方文檔對api的講解是很詳細的,可是官方不多會結合實際需求告訴你如何實現,可能某一個api你不熟悉你就沒法和實際需求聯想起來,但願看了 這篇文章想深刻了解的能夠從 CharSequence 接口(與上面的類緊密聯繫)進行展開。下一篇講 TextView ImageSpan 實現文字圖片混排。