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

相关文章

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

mapstruct中的@Mapper注解的基本用法

《mapstruct中的@Mapper注解的基本用法》在MapStruct中,@Mapper注解是核心注解之一,用于标记一个接口或抽象类为MapStruct的映射器(Mapper),本文给大家介绍ma... 目录1. 基本用法2. 常用属性3. 高级用法4. 注意事项5. 总结6. 编译异常处理在MapSt

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

java中long的一些常见用法

《java中long的一些常见用法》在Java中,long是一种基本数据类型,用于表示长整型数值,接下来通过本文给大家介绍java中long的一些常见用法,感兴趣的朋友一起看看吧... 在Java中,long是一种基本数据类型,用于表示长整型数值。它的取值范围比int更大,从-922337203685477

MyBatis ResultMap 的基本用法示例详解

《MyBatisResultMap的基本用法示例详解》在MyBatis中,resultMap用于定义数据库查询结果到Java对象属性的映射关系,本文给大家介绍MyBatisResultMap的基本... 目录MyBATis 中的 resultMap1. resultMap 的基本语法2. 简单的 resul

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

java中Optional的核心用法和最佳实践

《java中Optional的核心用法和最佳实践》Java8中Optional用于处理可能为null的值,减少空指针异常,:本文主要介绍java中Optional核心用法和最佳实践的相关资料,文中... 目录前言1. 创建 Optional 对象1.1 常规创建方式2. 访问 Optional 中的值2.1

git stash命令基本用法详解

《gitstash命令基本用法详解》gitstash是Git中一个非常有用的命令,它可以临时保存当前工作区的修改,让你可以切换到其他分支或者处理其他任务,而不需要提交这些还未完成的修改,这篇文章主要... 目录一、基本用法1. 保存当前修改(包括暂存区和工作区的内容)2. 查看保存了哪些 stash3. 恢