1. 程式人生 > >Android 中SpannableStringBuilder控制區域性文字顏色和點選事件

Android 中SpannableStringBuilder控制區域性文字顏色和點選事件

直接上程式碼

package com.lhl.qsmm.maskguidetest;

import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.ForegroundColorSpan;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView) findViewById(R.id.text);
        SpannableStringBuilder builder = new SpannableStringBuilder();
        String s1 = "你好";
        SpannableString sp1 = new SpannableString(s1);
        sp1.setSpan(new Clickable(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //在這裡新增點選事件
            }
        }),0,s1.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        ForegroundColorSpan fcs1 = new ForegroundColorSpan(ContextCompat.getColor(this,R.color.borline));
        sp1.setSpan(fcs1,0,s1.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);//設定字型的顏色
        builder.append(sp1);//新增

        String s2 = "安卓";
        SpannableString sp2 = new SpannableString(s2);
        sp2.setSpan(new Clickable(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //在這裡新增點選事件
                Toast.makeText(MainActivity.this, "點選", Toast.LENGTH_SHORT).show();
            }
        }),0,s2.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        ForegroundColorSpan fcs2 = new ForegroundColorSpan(ContextCompat.getColor(this,R.color.brightred));
        sp1.setSpan(fcs2,0,s1.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);//設定字型的顏色
        builder.append(sp2);
        mTextView.setText(builder);
        mTextView.setMovementMethod(LinkMovementMethod.getInstance());//加上這句話才有效果

        mTextView.setHighlightColor(ContextCompat.getColor(this,R.color.touming));//去掉點選後的背景顏色為透明
    }

    class Clickable extends ClickableSpan implements View.OnClickListener {
        private final View.OnClickListener mListener;

        public Clickable(View.OnClickListener mListener) {
            this.mListener = mListener;
        }

        @Override
        public void onClick(View v) {
            mListener.onClick(v);
        }

        @Override
        public void updateDrawState(TextPaint ds) {
            ds.setColor(ds.linkColor);
            ds.setUnderlineText(false);    //去除超連結的下劃線
        }
    }
}
結果

相關推薦

Android SpannableStringBuilder控制區域性文字顏色事件

直接上程式碼 package com.lhl.qsmm.maskguidetest; import android.os.Bundle; import android.support.v4.content.ContextCompat; import android.s

Android設定TextView部分字型顏色事件

  最近接到一個新需求,在一個TextView中實現部分字型的顏色不同於其它字型,且點選該部分文字時實現跳轉的功能。一開始想著用多個TextView連起來實現功能,優化程式碼時再想想,這也太弱智了點兒吧!   果斷Google搜尋一下別的Coder是怎麼實現的,

AndroidFragment+Viewpager實現左右滑動

一.佈局檔案 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.view.ViewPager android:id="@+id/viewpager" andr

Android 部分文字顏色大小事件的處理

Android開發中,經常會有這樣一個需求,在一段文字中,為突出顯示其中幾個文字,會採用不同的顏色,大小來顯示,並且有可能需要點選處理。先將自己平常用到的幾種方法總結如下。 1. 直接利用佈局實現 2. 利用富文字標籤實現 3. webview

Android用GridView畫帶背景色事件的簡單表格

一:效果圖 六步即可完成GridView不同背景色,並且每個單元格可點選 GridView佈局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="h

textview設定多種不同的字型顏色事件

最近專案需要用到textview為特定字元設定不同的顏色,如果用不同的控制元件拼起來的話一行也許沒有問題,但是如果換行的話效果就不理想了就像qq空間回覆品論的效果,暱稱和內容文字顏色不一樣,點選事件也不一樣。 目前我找到兩張方法,效果一樣。想用哪種看個人喜好

AndroidListView的item不能響應事件的原因

開發中很常見的一個問題,專案中的ListView不僅僅是簡單的文字,常常需要自己定義Listview。自己的Adapter去繼承BaseAdapter,在adapter中按照需求進行編寫,問題就出現了,可能會發生點選每一個item的時候沒有反應,無法獲取的焦點。原因

Android的ListView響應item內部按鈕事件

ListView可以說是我們在實際開發中最常用到的控制元件了。可以說每一個app都需要用到listview來顯示列表,如果我們需要點選listView的不同按鈕跳轉到不同頁面,具體邏輯在重寫的onItemClick()方法中實現,這裡不多說,不瞭解listVie

Android修改狀態列的顏色我們App的風格一樣

就是自定義一個主題: <resources> <!-- Base application theme. --> <style name="AppTheme" parent="AppBaseTheme"> <!-- Customiz

android 在selector同時設定button的圓角效果,簡單顏色無需美工

1,如果我們沒有美工來設計我們的圓角圖片,可以採用shape的方式實現: <?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://schemas.andr

關於android自定義字型顏色改變字型顏色

先看效果圖 上面的為點選按下的效果圖 上面的為預設的(鬆開按鈕)的效果圖 首先我們先在values資料夾下新建一個color.xml檔案 這檔案就是配置我們要使用的顏色 程式碼如下 <?xml version="1.0" encoding

android之View座標系(view獲取自身座標的方法事件座標的獲取)

在做一個view背景特效的時候被座標的各個獲取方法搞暈了,幾篇抄來抄去的部落格也沒弄很清楚。 現在把整個總結一下。 其實只要把下面這張圖看明白就沒問題了。 涉及到的方法一共有下面幾個: view獲取自身座標:getLeft(),getTop(),getRigh

Android Radiobutton超級好用的自定義背景、文字顏色效果

Android開發中一些認證、篩選的功能需要用到單選按鈕,首先想到的是RadioGroup巢狀RadioButton,但是自帶的樣式真是不堪入目啊,功能實現了,如何能最大化的提升使用者體驗呢?這是一個問題……廢話不多說,畢竟開發人員也不太善於表達,還是直接看圖說話吧:首先思路

Android-ListView巢狀(ListView)控制元件時item的事件不起作用的問題

解決:1、在主listview佈局檔案中的listview中新增屬性 android:focusable="false"              2、在子listview中最頂上的佈局檔案新增屬性

Android-UI佈局---RecyclerView學習(一)在介面卡自定義長按事件

該系列文章  如果想全方面學習,建議參考這個大牛的文章,寫的真可以。 地址:http://blog.csdn.net/lmj623565791/article/details/45059587 因為RecyclerView沒有點選、長按事件,需要自己寫 實現的方式比較多,

AndroidRecyclerview使用6----新增條目得到點事件長按事件(另一種寫法,較簡單)

效果圖 activity中: MainActivity <span style="font-size:18px;">public class MainActivity extends Activity { // private Recycler

Android開發:修改button的邊框改變背景

本文內容 講解如何修改button的邊框,點選button改變背景顏色 開啟在res/values目錄下的color.xml檔案,新增程式碼: <!-- 綠色 --> <color name="green">#008000</color>

ButterKnife (奶油刀) 找控制元件id事件的註解 簡單使用

首先 在app裡的build 最上面--------------------- apply plugin: ‘com.jakewharton.butterknife’ ----------------在app裡的build 加入依賴---------------------------

Android studio關於Spinner下拉列表的事件

首先在values下的string.xml檔案中新增下拉列表的內容: <string-array name="province1"> <item>河北</item> <item>北京<

Android 神器之SpanableString實現textview部分字型事件(不同顏色),並且支援多個事件

1.老規矩,咱們先上效果圖: 2.如上圖 標紅的地方,我們一眼看上去 就是一個TextView上面展示出來的(沒錯就是一個TextView展示出來的),並且 部分字型顏色不一樣,而且這個三個協議是可以點選的,點選跳轉到不同頁面,怎麼實現尼 ?,這裡就涉及到一個