1. 程式人生 > >Android開發技巧——去掉TextView中autolink的下劃線

Android開發技巧——去掉TextView中autolink的下劃線

我們知道,在佈局檔案中設定textview的autolink及其型別,這時textivew上會顯示link的顏色,並且文字下面會有一條下劃線,表示可以點選。而在我們在點選textview時,應用將根據我們所設定的型別跳轉到對應的介面。但是有時,我們因介面需求,需要去掉介面上顯示的下劃線,並保持功能不變。

如果已經設定了autolink,那麼在textview當中再去設定TextPaint為無下劃線是無效的,我們可以看URLSpan所繼承的類ClickableSpan類的原始碼,如下:

public abstract class ClickableSpan extends CharacterStyle implements UpdateAppearance {

    /**
     * Performs the click action associated with this span.
     */
    public abstract void onClick(View widget);
   
    /**
     * Makes the text underlined and in the link color.
     */
    @Override
    public void updateDrawState(TextPaint ds) {
        ds.setColor(ds.linkColor);
        ds.setUnderlineText(true);
    }
}

可以看到在這裡它是重新設定為有下劃線的。

所以要解決這個問題,就只有再設定一個沒有下劃線的Spannable物件。

首先,繼承一個CharacterStyle或其已實現的子類,重寫updateDrawState方法,程式碼如下:

/*
 * Date: 14-9-4
 * Project: Access-Control-V2
 */
package cn.irains.access.v2.common;

import android.text.TextPaint;
import android.text.style.UnderlineSpan;

/**
 * 無下劃線的Span
 * Author: msdx (
[email protected]
) * Time: 14-9-4 上午10:43 */ public class NoUnderlineSpan extends UnderlineSpan { @Override public void updateDrawState(TextPaint ds) { ds.setColor(ds.linkColor); ds.setUnderlineText(false); } }

然後在textview設定了內容之後,呼叫以下的程式碼,設定一個span:
NoUnderlineSpan mNoUnderlineSpan = new NoUnderlineSpan();
if (textview.getText() instanceof Spannable) {
    Spannable s = (Spannable) textview.getText();
    s.setSpan(mNoUnderlineSpan, 0, s.length(), Spanned.SPAN_MARK_MARK);
}
如果你是在listview中使用,並且用了holder,則span物件建立一個就可以了,然後在呼叫了setText之後再重新設定一遍span。這樣textview在介面上就不會有下劃線了,但卻保留著autolink的功能。