SpannableString的常用用法

2024-01-24 13:20

本文主要是介绍SpannableString的常用用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、BackgroundColorSpan 背景色
2、ClickableSpan 文本可点击,有点击事件
3、ForegroundColorSpan 文本颜色(前景色)
4、MaskFilterSpan 修饰效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)
5、MetricAffectingSpan 父类,一般不用
6、RasterizerSpan 光栅效果
7、StrikethroughSpan 删除线(中划线)
8、SuggestionSpan 相当于占位符
9、UnderlineSpan 下划线
10、AbsoluteSizeSpan 绝对大小(文本字体)
11、DynamicDrawableSpan 设置图片,基于文本基线或底部对齐。
12、ImageSpan 图片
13、RelativeSizeSpan 相对大小(文本字体)
14、ReplacementSpan 父类,一般不用
15、ScaleXSpan 基于x轴缩放
16、StyleSpan 字体样式:粗体、斜体等
17、SubscriptSpan 下标(数学公式会用到)
18、SuperscriptSpan 上标(数学公式会用到)
19、TextAppearanceSpan 文本外貌(包括字体、大小、样式和颜色)
20、TypefaceSpan 文本字体
21、URLSpan 文本超链接


以上是SpannableString的可用类型,这里只对ClickableSpan 、ImageSpan 、URLSpan 这3种做讲解。其他类似。
注:下文中,ClickableSpan的第二种方法,当要改变的数据有多次重复的时候,会有bug,解决办法,请参阅

http://blog.csdn.net/u014620028/article/details/51096023

先来布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextView
        android:id="@+id/tv_show"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:layout_marginTop="50dp"android:text="Hello World!"/>
</LinearLayout>

有的地方会用到Toast,这里附上单例Toast(不用等上一个消失,下一个才会出现,只用一个)

public class Utils {private static Toast toast;/*** 单例吐司*/public static void showToast(Context context, String msg) {if (toast == null) {toast = Toast.makeText(context, msg, Toast.LENGTH_SHORT);}toast.setText(msg);toast.show();}
}

代码讲解:
先初始化

String content = "滚滚长江东逝水,浪花淘尽英雄。是非成败转头空,青山依旧在,几度夕阳红。白发渔樵(qiáo)江渚(zhǔ)上,惯看秋月春风。一壶浊酒喜相逢,古今多少事,都付笑谈中。";SpannableString spannableString = new SpannableString(content);

1、ClickableSpan 第一种用法:给单个局部文字加颜色和点击事件

spannableString.setSpan(new ClickableSpan() {@Overridepublic void updateDrawState(TextPaint ds) {super.updateDrawState(ds);//设置指定区域的文字变蓝色ds.setColor(Color.BLUE);//设置指定区域的文字有下划线ds.setUnderlineText(true);}@Overridepublic void onClick(View widget) {Utils.showToast(MainActivity.this, "点击了");}}, 0, 7, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);//加上这句话,才有点击效果tv_show.setMovementMethod(LinkMovementMethod.getInstance());//把spannableString设置到TextView上tv_show.setText(spannableString);

效果图:
这里写图片描述

2、ClickableSpan 的第二种用法:给多个局部文字加颜色

ArrayList<String> list = new ArrayList<String>();list.add("长江");list.add("青山");list.add("夕阳红");list.add("秋月春风");for (int i = 0; i < list.size(); i++) {final String temp = list.get(i);String temp_content = content;int start = 0;while (temp_content.contains(temp)) {spannableString.setSpan(new ClickableSpan() {@Overridepublic void updateDrawState(TextPaint ds) {// TODO Auto-generated method stubsuper.updateDrawState(ds);// 设置指定区域的文字变红色ds.setColor(Color.BLUE);//设置指定区域的文字有下划线ds.setUnderlineText(false);}@Overridepublic void onClick(View widget) {Utils.showToast(MainActivity.this, "点击了" + temp);}}, start + temp_content.indexOf(temp), start + temp_content.indexOf(temp) + temp.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);tv_show.setText(spannableString);tv_show.setMovementMethod(LinkMovementMethod.getInstance());start = temp_content.indexOf(temp) + temp.length();temp_content = temp_content.substring(start);}}

效果图:
这里写图片描述

3、URLSpan ,超链接,点击指定区域,根据输入的链接跳转。设计网络,最好加上网络权限

 <uses-permission android:name="android.permission.INTERNET" />

(1)调用默认的

spannableString.setSpan(new URLSpan("https://hao.360.cn/"), 2, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);tv_show.setText(spannableString);tv_show.setMovementMethod(LinkMovementMethod.getInstance());

效果图:
这里写图片描述

(2)默认是有下划线,颜色是红色,假如不喜欢,自己模仿URLSpan写一个

/*** 自定义的URLSpan,设置字体是蓝色,没有下划线*/spannableString.setSpan(new MyUrlSpan("https://hao.360.cn/"), 10, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);tv_show.setText(spannableString);tv_show.setMovementMethod(LinkMovementMethod.getInstance());

效果图:
这里写图片描述
URLSpanMyUrlSpan源码在附录。区别在于updateDrawState()

4、ImageSpan (把指定区域的文字,换成图片)

 Drawable d = getResources().getDrawable(R.mipmap.ic_launcher);d.setBounds(0, 0, 100, 100);spannableString.setSpan(new ImageSpan(d), 3, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);tv_show.setText(spannableString);tv_show.setMovementMethod(LinkMovementMethod.getInstance());

效果图:
这里写图片描述

5、还可组合使用,这里以URLSpan 和ImageSpan 为例

 spannableString.setSpan(new MyUrlSpan("https://hao.360.cn/"), 10, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);Drawable d = getResources().getDrawable(R.mipmap.ic_launcher);
d.setBounds(0, 0, 100, 100);
spannableString.setSpan(new ImageSpan(d), 3, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv_show.setText(spannableString);
tv_show.setMovementMethod(LinkMovementMethod.getInstance());

效果图:
这里写图片描述


附录:
URLSpan 源码

/** Copyright (C) 2006 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**      http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package android.text.style;import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Parcel;
import android.provider.Browser;
import android.text.ParcelableSpan;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;public class URLSpan extends ClickableSpan implements ParcelableSpan {private final String mURL;public URLSpan(String url) {mURL = url;}public URLSpan(Parcel src) {mURL = src.readString();}public int getSpanTypeId() {return getSpanTypeIdInternal();}/** @hide */public int getSpanTypeIdInternal() {return TextUtils.URL_SPAN;}public int describeContents() {return 0;}public void writeToParcel(Parcel dest, int flags) {writeToParcelInternal(dest, flags);}/** @hide */public void writeToParcelInternal(Parcel dest, int flags) {dest.writeString(mURL);}public String getURL() {return mURL;}@Overridepublic void onClick(View widget) {Uri uri = Uri.parse(getURL());Context context = widget.getContext();Intent intent = new Intent(Intent.ACTION_VIEW, uri);intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());try {context.startActivity(intent);} catch (ActivityNotFoundException e) {Log.w("URLSpan", "Actvity was not found for intent, " + intent.toString());}}
}

MyUrlSpan源码

package com.chen.demo;import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.Parcel;
import android.provider.Browser;
import android.text.ParcelableSpan;
import android.text.TextPaint;
import android.text.style.ClickableSpan;
import android.util.Log;
import android.view.View;/*** Created by lenovo on 2016/3/25.*/
public class MyUrlSpan extends ClickableSpan implements ParcelableSpan {private final String mURL;public MyUrlSpan(String url) {mURL = url;}public MyUrlSpan(Parcel src) {mURL = src.readString();}public int getSpanTypeId() {return getSpanTypeIdInternal();}/*** @hide*/public int getSpanTypeIdInternal() {return 0;}public int describeContents() {return 0;}public void writeToParcel(Parcel dest, int flags) {writeToParcelInternal(dest, flags);}/*** @hide*/public void writeToParcelInternal(Parcel dest, int flags) {dest.writeString(mURL);}public String getURL() {return mURL;}@Overridepublic void onClick(View widget) {Uri uri = Uri.parse(getURL());Context context = widget.getContext();Intent intent = new Intent(Intent.ACTION_VIEW, uri);intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());try {context.startActivity(intent);} catch (ActivityNotFoundException e) {Log.w("URLSpan", "Actvity was not found for intent, " + intent.toString());}}@Overridepublic void updateDrawState(TextPaint ds) {super.updateDrawState(ds);ds.setUnderlineText(false);ds.setColor(Color.BLUE);}
}

ClickableSpan源码

/** Copyright (C) 2008 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**      http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package android.text.style;import android.text.TextPaint;
import android.view.View;/*** 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.*/@Overridepublic void updateDrawState(TextPaint ds) {ds.setColor(ds.linkColor);ds.setUnderlineText(true);}
}

这篇关于SpannableString的常用用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/639817

相关文章

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con

详解MySQL中JSON数据类型用法及与传统JSON字符串对比

《详解MySQL中JSON数据类型用法及与传统JSON字符串对比》MySQL从5.7版本开始引入了JSON数据类型,专门用于存储JSON格式的数据,本文将为大家简单介绍一下MySQL中JSON数据类型... 目录前言基本用法jsON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引

MySQL字符串常用函数详解

《MySQL字符串常用函数详解》本文给大家介绍MySQL字符串常用函数,本文结合实例代码给大家介绍的非常详细,对大家学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql字符串常用函数一、获取二、大小写转换三、拼接四、截取五、比较、反转、替换六、去空白、填充MySQL字符串常用函数一、