1. 程式人生 > >給你的TextView中的部分文字加入沒有下劃線的超連結

給你的TextView中的部分文字加入沒有下劃線的超連結

專案優化,當網路請求失敗時加上提醒,並可以點選TextView中的“重新整理”兩個字再次請求。使用ClickableSpan對超連結進行設定。預設情況下的樣式是這樣的:

想要的樣式是這樣的:

我們使用預設ClickableSpan的方法如下:

SpannableStringBuilder builder = new SpannableStringBuilder("(╯︵╰)\n網路走丟了,請重新整理試試");
int i = "(╯︵╰)\n網路走丟了,請重新整理試試".indexOf("刷");
builder.setSpan(new ClickableSpan() {
    @Override
    public void onClick(View widget) {
        page = 0;
        httpGetList(HTTP_GETDETAILDATA
); } },i,i+2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); noData_detailData.setText(builder); noData_detailData.setMovementMethod(LinkMovementMethod.getInstance()); Utils.setToast(context, "網路偷了會兒懶,請稍後重試");

這些程式碼中最需要強調的就是

noData_detailData.setMovementMethod(LinkMovementMethod.getInstance());

這一行是必須的,不然能夠顯示樣式,但是沒法實現點選效果。

很明顯預設的樣式無法滿足我們的需要了,現在實現自定義的樣式:

自定義NoUnderLineClickableSpan繼承自ClickableSpan,來看一下ClickableSpan的原始碼:

/**
 * If an object of this type is attached to the text of a TextView
 * with a movement method of LinkMovementMethod, the affected spans of
 * text can be selected.  If clicked, the {@link #onClick} method will
* be called. */ 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); } }

這個類中只有兩個方法,onClick方法是我們需要實現的方法,很明顯是我們點選文字後要乾的事,我這裡就是通過http請求資料。

第二個方法是我們自定義的重點,也很簡單嘛,只有兩行,ds.setColor肯定是在設定超連結文字的顏色,也就是專案中“重新整理”這兩個字的顏色。ds.setUnderlineText,看名字也知道是在設定下劃線,傳入boolean值,當傳入true時超連結文字將會顯示下劃線,當傳入false時超連結文字將不會顯示下劃線,就是這麼簡單。

下面是專案中自定義的NoUnderlineClickableSpan的程式碼:

/**
 * 自定義沒有下劃線,文字是藍色的ClickableSpan
 * Created by Qiju on 2017/10/16.
 *
 */
public class NoUnderLineClickableSpan extends ClickableSpan {
    @Override
    public void onClick(View widget) {

    }

    /**
     * 設定超連結顏色為藍色,沒有下劃線
* @param ds
*/
@Override
    public void updateDrawState(TextPaint ds) {
        ds.setColor(Color.BLUE);
        ds.setUnderlineText(false);
    }
}