android給textview中的文字加連接

需求中有一個要給幾個文字加連接,好比:註冊,這樣。有不少方法,總結以下: html

1.使用Android Linkify添加超連接  java

以前使用Java開發桌面應用的時候,在JTextPane中添加超連接而且設置監聽是個很麻煩的事情,最終我也沒找到一個很好的方法。用來開發android就爽了,API封裝的不錯,添加個超連接變的很是簡單。

首先,在TextView所屬xml配置文件中,直接添加android:autoLink特性便可,它支持一個或多個(用分割)自定義的值:none、web、email、phone或all。

另外,你還能夠用Linkify來添加超連接,下面介紹一下這個類:

Linkify是一個輔助類,經過RegEx樣式匹配,自動地在TextView類(和繼承的類)中建立超連接。

符合特定的RegEx樣式的文本會被轉變成可點擊的超連接,這些超連接隱式地調用startActivity(new Intent(Intent.ACTION_VIEW, uri)),符合的文本會做爲目標URI。

你能夠指定任意的字符串樣式爲連接;方便地,Linkify類提供了預置的通用內容類型(如電話號碼和e-mail、web地址)。

Linkify.addLinks靜態方法接受一個View來製做連接,還包括一個或多個支持的默認內容類型的位結果。Linkify類提供了一些內容類型:WEB_URLS、EMAIL_ADDRESSES、PHONE_NUMBERS和ALL.

接下來的代碼片斷顯示如何爲TextView製做連接顯示web和e-mail地址爲超連接。當點擊時,它們會相應地打開瀏覽器或e-mail應用程序。
TextView textView = (TextView)findViewById(R.id.myTextView);
Linkify.addLinks(textView, Linkify.WEB_URLSLinkify.EMAIL_ADDRESSES);

但是有時候咱們須要自定義一些超連接,像新浪微博中的@和#,這時候怎麼辦呢?

爲了定義本身的連接字符串,你須要建立一個RegEx樣式來匹配文本,進而顯示成超連接。和本地類型同樣,經過調用Linkify.addLinks來指定目標View,但此次,傳入的是的RegEx樣式。你還能夠傳入一個前綴,當連接點擊時,它會添加到目標URI上。例如:
int flags = Pattern.CASE_INSENSITIVE;
Pattern p = Pattern.compile(「\\bquake[-9]*\\b」, flags);
Linkify.addLinks(myTextView, p, 「content://com.paad.earthquake/earthquakes/」); android


2.android的TextView使用Html來處理圖片顯示、字體樣式、超連接等  web

1、[Android實例]實現TextView裏的文字有不一樣顏色
轉eoe:http://www.eoeandroid.com/thread-4496-1-1.html
import android.text.Html;
TextView t3 = (TextView) findViewById(R.id.text3);
        t3.setText(
            Html.fromHtml(
                "<b>text3:</b>  Text with a " +
                "<a href=\"http://www.google.com\">link</a> " +
                "created in the Java source code using HTML."));
2、TextView顯示html文件中的圖片
轉javaeye:http://da-en.javaeye.com/blog/712415
咱們知道要讓TextView解析和顯示Html代碼。可使用
Spanned text = Html.fromHtml(source);
tv.setText(text);
來實現,這個用起來簡單方便。
可是,怎樣讓TextView也顯示Html中<image>節點的圖像呢?
咱們能夠看到fromHtml還有另外一個重構:
fromHtml(String source, Html.ImageGetter imageGetter, Html.TagHandler tagHandler)
實現一下ImageGetter就可讓圖片顯示了:
ImageGetter imgGetter = new Html.ImageGetter() {
             @Override
             public Drawable getDrawable(String source) {
                   Drawable drawable = null;
                   drawable = Drawable.createFromPath(source);  // Or fetch it from the URL
                   // Important
                   drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable
                                 .getIntrinsicHeight());
                   return drawable;
             }
};
至於TagHandler,咱們這裏不須要使用,能夠直接傳null。
參考文檔:
http://tech-droid.blogspot.com/2010/06/textview-with-html-content.html英語好的朋友就直接看英文文檔吧。
3、Android---文字中插入表情
    轉載自:http://blog.163.com/spf9190@126/blog/static/50207531201091545954587/
       這段時間在作一個短信項目,須要實現短信中插入表情的功能,本一位很是困難,通過一段時間的研究,發現仍是比較簡単的,如今總結以下。
       以短信輸入框爲例,短信的輸入框是一個EditText,它的append方法不只能夠加入字符串,還能夠添加HTML標記。如下就是使用HTML標記添加表情的具體操做。
   首先須要構建一個ImageGetter,做用是經過HTML標記得到對應在res目錄下的圖片:
       ImageGetter imageGetter = new ImageGetter() {  
        @Override
       public Drawable getDrawable(String source) {
       int id = Integer.parseInt(source);
      //根據id從資源文件中獲取圖片對象
       Drawable d = getResources().getDrawable(id);
       d.setBounds(0, 0, d.getIntrinsicWidth(),d.getIntrinsicHeight());
        return d;
       }
       };          
而後就能夠直接往EditText視圖中添加
       inputLable.append(Html.fromHtml("<img src='"+clickedImageId+"'/>", imageGetter, null));                 
  其中 Html.fromHtml("<img src='"+clickedImageId+"'/>"就是HTML的圖片標記,在Android中支持了部分HTML標記的使用(這方面我還在繼續研究),HTML標記必須被Html.fromHtml修飾。imageGetter即爲以前建立的ImageGetter類型的對象。
很簡單的幾句代碼就解決了問題,不只在EditText中,在TextView中一樣能夠這樣插入圖片。
效果圖: 瀏覽器

 
4、android 短信字符轉表情顯示過程
android 的短信實現方式普通用戶適應的話須要長時間的使用才能習慣,將andorid的短信模式設置成咱們經常使用的(通常人用戶)的習慣。在查看字符轉圖片的過程當中能夠猜想出騰訊的QQ表情的原理應該是同樣的只是在傳送很是用的表情時是將byte數據轉換爲image.
如下代碼摘錄至android源碼裏面的MMS項目,其中的
package com.android.mms.ui 裏的 MessageListItem.java
package com.android.mms.util 裏的 SmileyParser.java
/***
     * 
         * 此方法描述的是:   注意此方法在作表情轉換的準備了
         * @author :wujun@cqghong.com,ppwuyi@sohu.com
         * @version: 2010-5-13 下午03:31:13
     */
    private void bindCommonMessage(final MessageItem msgItem) {
        if (mDownloadButton != null) {
            mDownloadButton.setVisibility(View.GONE);
            mDownloadingLabel.setVisibility(View.GONE);
        }
        // Since the message text should be concatenated with the sender's
        // address(or name), I have to display it here instead of
        // displaying it by the Presenter.
        mBodyTextView.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
        // Get and/or lazily set the formatted message from/on the
        // MessageItem. Because the MessageItem instances come from a
        // cache (currently of size ~50), the hit rate on avoiding the
        // expensive formatMessage() call is very high.
        CharSequence formattedMessage = msgItem.getCachedFormattedMessage();
        if (formattedMessage == null) { //確定爲null應爲msgItem.formattedMessage從誕生來就沒被注意過一次
            formattedMessage = formatMessage(msgItem.mContact, msgItem.mBody,   //重點到了
                                             msgItem.mSubject, msgItem.mTimestamp,
                                             msgItem.mHighlight);
            msgItem.setCachedFormattedMessage(formattedMessage);
        }
        mBodyTextView.setText(formattedMessage);
        if (msgItem.isSms()) {
            hideMmsViewIfNeeded();
        } else {
            Presenter presenter = PresenterFactory.getPresenter(
                    "MmsThumbnailPresenter", mContext,
                    this, msgItem.mSlideshow);
            presenter.present();
            if (msgItem.mAttachmentType != WorkingMessage.TEXT) {
                inflateMmsView();
                mMmsView.setVisibility(View.VISIBLE);
                setOnClickListener(msgItem);
                drawPlaybackButton(msgItem);
            } else {
                hideMmsViewIfNeeded();
            }
        }
        drawLeftStatusIndicator(msgItem.mBoxId);
        drawRightStatusIndicator(msgItem);
    }
//------------------------------------------------------------------------------
/***
     * 
         * 此方法描述的是:   開始轉換了哦
         * @author :wujun@cqghong.com,ppwuyi@sohu.com
         * @version: 2010-5-13 下午03:32:52
     */
    private CharSequence formatMessage(String contact, String body, String subject,
                                       String timestamp, String highlight) {
        CharSequence template = mContext.getResources().getText(R.string.name_colon); //遇到鬼了     &lt;主題:<xliff:g id="SUBJECT">%s</xliff:g>&gt;"
        SpannableStringBuilder buf =                   //把他看成StringBuffer只是它能夠放的不是 String 而已他能放跟多類型的東西
            new SpannableStringBuilder(TextUtils.replace(template,
                new String[] { "%s" },
                new CharSequence[] { contact })); //替換成聯繫人
        boolean hasSubject = !TextUtils.isEmpty(subject); //主題
        if (hasSubject) {
            buf.append(mContext.getResources().getString(R.string.inline_subject, subject)); //buff先在是 聯繫人 主題 XXXX      eg wuyi <主題:dsadasdsa> 我愛我家
        }
        if (!TextUtils.isEmpty(body)) {
            if (hasSubject) {
                buf.append(" - "); //若是內容有主題有就+ " - "    eg wuyi <主題:sdsadsadsa> -
            }
            SmileyParser parser = SmileyParser.getInstance(); //得到表情類了哦
            buf.append(parser.addSmileySpans(body)); //追查 急切關注中
        }
        if (!TextUtils.isEmpty(timestamp)) {
            buf.append("\n");
            int startOffset = buf.length();
            // put a one pixel high spacer line between the message and the time stamp as requested
            // by the spec.
            //把之間的信息和時間戳的要求間隔一個像素的高線
            //由規範
            buf.append("\n");
            buf.setSpan(new AbsoluteSizeSpan(3), startOffset, buf.length(),
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            startOffset = buf.length();
            buf.append(timestamp);
            buf.setSpan(new AbsoluteSizeSpan(12), startOffset, buf.length(),
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            // Make the timestamp text not as dark 改變某區域顏色   時間的地方爲特殊顏色
            int color = mContext.getResources().getColor(R.color.timestamp_color);
            buf.setSpan(new ForegroundColorSpan(color), startOffset, buf.length(),
                    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        if (highlight != null) {
            int highlightLen = highlight.length();
            String s = buf.toString().toLowerCase();
            int prev = 0;
            while (true) {
                int index = s.indexOf(highlight, prev);
                if (index == -1) {
                    break;
                }
                buf.setSpan(new StyleSpan(Typeface.BOLD), index, index + highlightLen, 0);
                prev = index + highlightLen;
            }
        }
        return buf;
    }
//------------------------------------------------------------
/**
     * Adds ImageSpans to a CharSequence that replace textual emoticons such
     * as :-) with a graphical version.
     * 
     * @param text A CharSequence possibly containing emoticons
     * @return A CharSequence annotated with ImageSpans covering any
     *         recognized emoticons.
     * 添加ImageSpans一個CharSequence的表情符號代替文字等     *如用圖形版本:-)。
     * 核心是把表情字符替換成ImageSpans的對象
     */
    public CharSequence addSmileySpans(CharSequence text) {
        SpannableStringBuilder builder = new SpannableStringBuilder(text);
        Matcher matcher = mPattern.matcher(text);
        while (matcher.find()) {
            int resId = mSmileyToRes.get(matcher.group());
            //注意下面的一塊有點很差理解哦可是是核心
            builder.setSpan(new ImageSpan(mContext, resId), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        return builder;
    }
總結:
     android 在將字符轉化爲表情圖像其核心代碼爲
builder.setSpan(new ImageSpan(mContext, resId), matcher.start(), matcher.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
原理過程是先匹配到表情字符而後經過new ImageSpan(上下文,表情地址)繪製出一個ImageView而後替換掉表情字符。
5、 Android TextView 支持的HTML標籤
<a href="..."> 
<b> 
<big> 
<blockquote> 
<br> 
<cite> 
<dfn> 
<div align="..."> 
<em> 
<font size="..." color="..." face="..."> 
<h1> 
<h2> 
<h3> 
<h4> 
<h5> 
<h6> 
<i> 
<img src="..."> 
<p> 
<small> 
<strike> 
<strong> 
<sub> 
<sup> 
<tt> app


3.android中用Spannable在TextView中設置超連接、顏色、字體 ide

這個文章寫的不錯,懶得整理了,把連接弄過來。
post

http://aichixihongshi.iteye.com/blog/1207503 字體


4.下面這個也不錯,算是挺細的了。 fetch

http://android.group.iteye.com/group/wiki/2904-android-widget-textview

相關文章
相關標籤/搜索