Android中Textview文字设置不同颜色、下划线、加粗、超链接

Android中Textview文字设置不同颜色、下划线、加粗、超链接

在项目中会遇到在一行文字,部分需要不同的文字颜色、下划线以及超链接来展示,下面介绍两种方式实现:

Android中Textview文字设置不同颜色、下划线、加粗、超链接

1、SpannableString来实现

1)简介

对于给Textview设置不同颜色,就不得不提SpannableString,当然给textview设置不同的字体颜色也可以通过加HTML标签来实现,但是有SpannableString的存在,为啥不用呢.(相比Html 相对简短易理解但还是建议掌握SpannableString)。

先简单的介绍一下SpannableString,SpannableStringBuilder.

首先SpannableString、SpannableStringBuilder基本上与String差不多,也是用来存储字符串,但它们俩的特殊就在于有一个SetSpan()函数,

能给这些存储的String添加各种格式或者称样式(Span),将原来的String以不同的样式显示出来,比如在原来String上加下划线、加背景色、改变字体

颜色、用图片把指定的文字给替换掉,加超链接等等。总而言之,SpannableString和SpannableStringBuilder和string差不多,但是不能给字符串设置

不同的样式.

注意:如果这些额外信息能被所用的方式支持,比如将SpannableString传给TextView;也有对这些额外信息不支持的,比如自定义view中Canvas绘制

文字,对于不支持的情况,SpannableString和SpannableStringBuilder就是退化为String类型,直接显示原来的String字符串,而不会再显示这些附加的

额外信息。

当然,SpannableString和SpannableStringBuilder也是存在区别的,它们的区别在于 SpannableString像一个String一样,构造对象的时候传入一个

String,之后再无法更改String的内容,也无法拼接多个 SpannableString;而SpannableStringBuilder则更像是StringBuilder,它可以通过其append()方

法来拼接多个String.

//使用SpannableString,必须一次传入,构造完成 
//使用SpannableStringBuilder,可以使用append()再添加 

SpannableStringBuilder bWord = newSpannableStringBuilder();
bWord.append("我爱大前端");
bWord.append("和全栈");

由于SpannableString和SpannableStringBuilder都实现了CharSequence接口,所以可以直接把SpannableString和SpannableStringBuilder通过TextView.setText()设置给TextView。

2)具体使用

给文本设置不同的样式是通过setSpan()方法来实现的,其中的具体样式根据参数来定义。

主要实现方法 SpannableString.setSpan(Object what, int start, int end, int flags)

what 参数,控制文本效果,主要有以下类型
BackgroundColorSpan 背景色
ClickableSpan 点击事件
ForegroundColorSpan 文本颜色(前景色)
MaskFilterSpan 修饰效果,如模糊(BlurMaskFilter)浮雕(EmbossMaskFilter)
MetricAffectingSpan 父类,一般不用
RasterizerSpan 光栅效果
StrikethroughSpan 删除线
SuggestionSpan 占位符
UnderlineSpan 下划线
AbsoluteSizeSpan 文本字体,绝对大小
DynamicDrawableSpan 设置图片,基于文本基线或底部对齐
ImageSpan 图片
RelativeSizeSpan 文本字体,相对大小
ReplacementSpan 父类,一般不用
ScaleXSpan 基于x轴缩放
StyleSpan 字体样式:粗体、斜体等
SubscriptSpan 下标(数学公式会用到)
SuperscriptSpan 上标(数学公式会用到)
TextAppearanceSpan 文本外貌(包括字体、大小、样式和颜色)
TypefaceSpan 文本字体
URLSpan 文本超链接
start、end 参数
start 指定span开始位置。包括该位置。 
end 指定span结束位置,不包括该位置。

flags 参数,指定前后文本会不会用span样式
Spannable.SPAN_INCLUSIVE_EXCLUSIVE 前面用,后面不用
Spannable.SPAN_INCLUSIVE_INCLUSIVE 前后都会使用span样式
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 前后都不会使用span样式
Spannable.SPAN_EXCLUSIVE_INCLUSIVE 前面不用,后面用

具体的介绍就是上面,就不一一举例子

Android中Textview文字设置不同颜色、下划线、加粗、超链接

package com.xaaccp.myapp;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.res.ColorStateList;
import android.content.res.XmlResourceParser;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.BackgroundColorSpan;
import android.text.style.BulletSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.RelativeSizeSpan;
import android.text.style.ScaleXSpan;
import android.text.style.StrikethroughSpan;
import android.text.style.StyleSpan;
import android.text.style.SubscriptSpan;
import android.text.style.SuperscriptSpan;
import android.text.style.TextAppearanceSpan;
import android.text.style.TypefaceSpan;
import android.text.style.URLSpan;
import android.text.style.UnderlineSpan;
import android.widget.TextView;

import org.xmlpull.v1.XmlPullParserException;

import java.io.IOException;

public class MainActivity extends Activity {

    TextView mTextView = null;
    SpannableString msp = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTextView = (TextView) findViewById(R.id.tv);

        //创建一个 SpannableString对象
        msp = new SpannableString("字体测试字体大小一半两倍前景色背景色正常粗体斜体粗斜体下划线删除线x8x3电话邮件网站短信彩信地图X轴综合/bot");

        //设置字体(default,default-bold,monospace,serif,sans-serif)
        msp.setSpan(new TypefaceSpan("monospace"), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        msp.setSpan(new TypefaceSpan("serif"), 2, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        //设置字体大小(绝对值,单位:像素)
        msp.setSpan(new AbsoluteSizeSpan(20), 4, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        msp.setSpan(new AbsoluteSizeSpan(20, true), 6, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //第二个参数boolean dip,如果为true,表示前面的字体大小单位为dip,否则为像素,同上。

        //设置字体大小(相对值,单位:像素) 参数表示为默认字体大小的多少倍
        msp.setSpan(new RelativeSizeSpan(0.5f), 8, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //0.5f表示默认字体大小的一半
        msp.setSpan(new RelativeSizeSpan(2.0f), 10, 12, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //2.0f表示默认字体大小的两倍

        //设置字体前景色
        msp.setSpan(new ForegroundColorSpan(Color.MAGENTA), 12, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //设置前景色为洋红色

        //设置字体背景色
        msp.setSpan(new BackgroundColorSpan(Color.CYAN), 15, 18, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //设置背景色为青色

        //设置字体样式正常,粗体,斜体,粗斜体
        msp.setSpan(new StyleSpan(Typeface.NORMAL), 18, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //正常
        msp.setSpan(new StyleSpan(Typeface.BOLD), 20, 22, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //粗体
        msp.setSpan(new StyleSpan(Typeface.ITALIC), 22, 24, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //斜体
        msp.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 24, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //粗斜体

        //设置下划线
        msp.setSpan(new UnderlineSpan(), 27, 30, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        //设置删除线
        msp.setSpan(new StrikethroughSpan(), 30, 33, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        //设置上下标
        msp.setSpan(new SubscriptSpan(), 34, 35, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //下标
        msp.setSpan(new SuperscriptSpan(), 36, 37, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //上标

        //超级链接(需要添加setMovementMethod方法附加响应)
        msp.setSpan(new URLSpan("tel:10086"), 37, 39, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //电话
        msp.setSpan(new URLSpan("123456789@qq.com"), 39, 41, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //邮件
        msp.setSpan(new URLSpan("http://www.baidu.com "), 41, 43, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //网络
        msp.setSpan(new URLSpan("sms:10086"), 43, 45, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //短信 使用sms:或者smsto:
        msp.setSpan(new URLSpan("mms:10086"), 45, 47, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //彩信 使用mms:或者mmsto:
        msp.setSpan(new URLSpan("geo:38.899533,-77.036476"), 47, 49, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //地图
        //设置字体大小(相对值,单位:像素) 参数表示为默认字体宽度的多少倍
        msp.setSpan(new ScaleXSpan(2.0f), 49, 51, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //2.0f表示默认字体宽度的两倍,即X轴方向放大为默认字体的两倍,而高度不变
        //设置字体(依次包括字体名称,字体大小,字体样式,字体颜色,链接颜色)
        ColorStateList csllink = null;
        ColorStateList csl = null;

//        @SuppressLint("ResourceType") XmlResourceParser xppcolor = getResources().getXml(R.color.color);
//        try {
//            csl = ColorStateList.createFromXml(getResources(), xppcolor);
//        } catch (XmlPullParserException e) {
//            e.printStackTrace();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }

//        @SuppressLint("ResourceType") XmlResourceParser xpplinkcolor = getResources().getXml(R.color.linkcolor);
//        try {
//            csllink = ColorStateList.createFromXml(getResources(), xpplinkcolor);
//        } catch (XmlPullParserException e) {
//            e.printStackTrace();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }

        msp.setSpan(new TextAppearanceSpan("monospace",android.graphics.Typeface.BOLD_ITALIC, 30, csl, csllink), 51,
                53, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //设置项目符号
        msp.setSpan(new BulletSpan(android.text.style.BulletSpan.STANDARD_GAP_WIDTH,Color.GREEN),0 ,msp.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //<span style="font-family: Arial;"> //第一个参数表示项目符号占用的宽度,第二个参数为项目符号的颜色 </span>


        //设置图片
        // Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher);
        // drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
        // msp.setSpan(new ImageSpan(drawable), 53, 57, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        mTextView.setText(msp);
        mTextView.setMovementMethod(LinkMovementMethod.getInstance());

    }
}

2、用HTML的方式实现:

结构如下

java.lang.Object

   ↳

android.text.Html

类用于处理的HTML字符串并将其转换成可显示的样式文本。但并不是所有的HTML标记的支持。

说其简单是应为它就有四个方法:

                              Public Methods

static String

escapeHtml(CharSequence text)

从给定的代表性名文中返回Html转义字符。

static Spanned

fromHtml(String source)

从Html字符串中返回可显示的样式文本。

static Spanned

fromHtml(String source, Html.ImageGetter imageGetter, Html.TagHandler tagHandler)

从Html字符串中返回可显示的样式文本

static String

toHtml(Spanned text)

将文本转换成Html。

设置不用颜色如下

TextView mTextView=(TextView)findViewById(R.id.tv); 

String str="<font color='#4d8ade'>只会玩战士</font>回复<font color='#4d8ade'>冷云他大叔</font>:啊哈哈哈或"; 

mTextView.setTextSize(15); 

mTextView.setText(Html.fromHtml(str));

设置下划线如下

mTextView.setText(Html.fromHtml("已有账号,去"+"<u>"+"登陆"+"</u>"));

 

PS:如果不在HTML标签最前面加入其他HTML元素,此函数可能不会生效。

 

 

 

书到用时方恨少,纸上得来终觉浅。希望对你有所帮助!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114976.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pytest的使用_java中方法的调用

    pytest的使用_java中方法的调用Pytest执行用例规则Pytest在命令行中支持多种方式来运行和选择测试用例1.对某个目录下所有的用例pytest2.对模块中进行测试pytesttest_mod.py3.对文件夹进行

    2022年7月29日
    9
  • android加载dex方法,android Dex文件的加载

    android加载dex方法,android Dex文件的加载上篇文章讲到了apk的分包,通过multidex构建出包含多个dex文件的apk,从而解决65536的方法数限制问题《AndroidDex分包》。在dalvik虚拟机上,应用启动时只会加载主dex文件,而从dex需要我们手动去加载,那么问题来了,如何手动加载一个dex文件?前面也提到了,使用DexClassLoader和PathClassLoader。DexClassLoader和PathCla…

    2022年6月27日
    75
  • linux复制/剪切文件到另一个文件夹「建议收藏」

    linux复制/剪切文件到另一个文件夹「建议收藏」复制/拷贝:cp文件名路径cphello.csv./python/ml:把当前目录的hello.csv拷贝到当前目的python文件夹里的ml文件夹里cp源文件名新文件名cphello.txtworld.txt:复制并改名,并存放在当前目录下cpfile1file2复制一个文件cpdir/*.复制一个目录下的所有文件…

    2022年8月23日
    19
  • java inputstream和outputstream_java input

    java inputstream和outputstream_java input原文地址:http://www.zgljl2012.com/javaji-chu-inputstream-inputstreamreaderhe-bufferedreader/在Java中,上述三个类经常用于处理数据流,下面介绍一下三个类的不同之处以及各自的用法。InputStream:是所有字节输入流的超类,一般使用它的子类:FileInputStream等,它能输出字节流;…

    2022年9月26日
    2
  • ubuntu更新源报错_cydia更新软件源很慢

    ubuntu更新源报错_cydia更新软件源很慢错误我在Ubuntu上的/etc/apt/sources.list加入源后执行sudoapt-getupdate出现下图错误:原因在sources.list文件中加入了非ubuntu官方源,所以认为加入源是不可信任的。解决方法导入该源公钥。E084DAB9为上图中公钥后八位gpg–keyserverkeyserver.ubuntu.com-

    2022年10月13日
    3
  • Git 工具 – 高级合并「建议收藏」

    高级合并在Git中合并是相当容易的。因为Git使多次合并另一个分支变得很容易,这意味着你可以有一个始终保持最新的长期分支,经常解决小的冲突,比在一系列提交后解决一个巨大的冲突要好。然而,有时也会有棘手的冲突。不像其他的版本控制系统,Git并不会尝试过于聪明的合并冲突解决方案。Git的哲学是聪明地决定无歧义的合并方案,但是如果有冲突,它不会尝试智能地自动解决它。因此,如果很久之后才合并两个分叉的分支,你可能会撞上一些问题。在本节中,我们将会仔细查看那些问题是什么以及Git

    2022年4月6日
    73

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号