android TextView(4)-SpannableString&SpannableStringBuffer定制文本

Android TextView.BufferType使用示例 在Android开发中,TextView是一种常用的UI组件,用于显示文本内容。TextView提供了不同的BufferType选项,用于控制文本的显示方式。在这种模式下,文本内容将被直接显示在TextView上,没有特殊的效果或处理。在上述代码中,我们将TextView的BufferType设置为EDITABLE,并提供了初始文本内容。用户可以在运行时编辑这段文本。在上述代码中,我们使用Html.fromHtml方法创建了一个包含粗体和斜体的Spanned对象,并将其应用于TextView。 阅读详情

实现部分可点击的TextView

效果类似微信朋友圈里点赞的效果

这里写图片描述

1.初始化n个朋友

StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 10; i++) {
        sb.append("朋友" + i + ",");
    }

2.去除最后的逗号

String likeUsers = sb.substring(0, sb.lastIndexOf(",")).toString();

3.设置文本

mT2.setMovementMethod(LinkMovementMethod.getInstance());
mT2.setText(addClickPart(likeUsers), TextView.BufferType.SPANNABLE);

4.addClickPart(String str);实现方法

设置赞的图片

ImageSpan imgspan = new ImageSpan(MyHtmlActivity.this, R.drawable.like);
SpannableString spanStr = new SpannableString("p");
spanStr.setSpan(imgspan, 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

5.创建一个SpannableStringBuilder对象,连接多个字符串

SpannableStringBuilder ssb = new SpannableStringBuilder(spanStr);
ssb.append(str);

6.切割字符串,得到”,”分隔的每个内容

String[] likeUsers = str.split(",");

7.给每个内容设置ClickableSpan

for (int i = 0; i < likeUsers.length; i++) {
    final String name = likeUsers[i];
    final int start = str.indexOf(name) + spanStr.length();
    ssb.setSpan(new ClickableSpan() {
        @Override
        public void onClick(View widget) {
            Toast.makeText(MyHtmlActivity.this, name,
                    Toast.LENGTH_SHORT).show();
        }

        @Override
        public void updateDrawState(TextPaint ds) {
            super.updateDrawState(ds);
            //删除下划线,设置字体颜色
            ds.setColor(Color.BLUE);
            ds.setUnderlineText(false);
        }
    },start,start + name.length(),0);
}

包括两个重载方法一个处理点击事件,另一个指定样式

8.最后返回这个SpannableStringBuilder用于setText

return ssb.append("等" + likeUsers.length + "个人觉得很赞");

本篇和上篇 完整代码:

public class MyHtmlActivity extends AppCompatActivity {

private TextView mTv_html;
private TextView mT2;
private TextView mT1;

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

    mTv_html = (TextView) findViewById(R.id.tv_html);
    mT2 = (TextView) findViewById(R.id.txtTwo);
//        setHtml1();
//        setHtml2();
//        setHtml3();
    setHtml4();

}

private void setHtml4() {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 10; i++) {
        sb.append("朋友" + i + ",");
    }

    String likeUsers = sb.substring(0, sb.lastIndexOf(",")).toString();
    mT2.setMovementMethod(LinkMovementMethod.getInstance());
    mT2.setText(addClickPart(likeUsers), TextView.BufferType.SPANNABLE);
}

//定义一个点击每个部分文字的处理方法
private SpannableStringBuilder addClickPart(String str) {
    //赞的图标
    ImageSpan imgspan = new ImageSpan(MyHtmlActivity.this, R.drawable.like);
    SpannableString spanStr = new SpannableString("p");
    spanStr.setSpan(imgspan, 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

    //创建一个SpannableStringBuilder对象,连接多个字符串
    SpannableStringBuilder ssb = new SpannableStringBuilder(spanStr);
    ssb.append(str);
    String[] likeUsers = str.split(",");
    if (likeUsers.length > 0) {
        for (int i = 0; i < likeUsers.length; i++) {
            final String name = likeUsers[i];
            final int start = str.indexOf(name) + spanStr.length();
            ssb.setSpan(new ClickableSpan() {
                @Override
                public void onClick(View widget) {
                    Toast.makeText(MyHtmlActivity.this, name,
                            Toast.LENGTH_SHORT).show();
                }

                @Override
                public void updateDrawState(TextPaint ds) {
                    super.updateDrawState(ds);
                    //删除下划线,设置字体颜色
                    ds.setColor(Color.BLUE);
                    ds.setUnderlineText(false);
                }
            },start,start + name.length(),0);
        }
    }
    return ssb.append("等" + likeUsers.length + "个人觉得很赞");
}

private void setHtml3() {
    mT1 = (TextView) findViewById(R.id.txtOne);
    mT2 = (TextView) findViewById(R.id.txtTwo);

    SpannableString span = new SpannableString("红色打电话斜体删除线绿色下划线图片:.");
    //1.设置背景色,setSpan时需要指定的flag,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(前后都不包括)
    span.setSpan(new ForegroundColorSpan(Color.RED), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    //2.用超链接标记文本
    span.setSpan(new URLSpan("tel:4155551212"), 2, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    //3.用样式标记文本(斜体)
    span.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 5, 7, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    //4.用删除线标记文本
    span.setSpan(new StrikethroughSpan(), 7, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    //5.用下划线标记文本
    span.setSpan(new UnderlineSpan(), 10, 16, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    //6.用颜色标记
    span.setSpan(new ForegroundColorSpan(Color.GREEN), 10, 13,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    //7.//获取Drawable资源
    Drawable d = getResources().getDrawable(R.drawable.iv_bg);
    d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
    //8.创建ImageSpan,然后用ImageSpan来替换文本
    ImageSpan imgspan = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
    span.setSpan(imgspan, 18, 19, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
    mT1.setText(span);
}

private void setHtml2() {
    String s = "<img src='iv_bg'/></br>";
    Spanned spanned = Html.fromHtml(s, new Html.ImageGetter() {
        @Override
        public Drawable getDrawable(String source) {
            Drawable drawable = null;
            try {
                Field field = R.drawable.class.getField(source);
                String stringId = field.get(null).toString();
                int resourceId = Integer.parseInt(stringId);
                drawable = getResources().getDrawable(resourceId);
                drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            return drawable;
        }
    }, null);
    mTv_html.setMovementMethod(LinkMovementMethod.getInstance());
    mTv_html.setText(spanned);
}

private void setHtml1() {
    String s = "<font color='blue'><b> 百度一下你就知道</b></font><br> ";
    s += "<a href = 'http://www.baidu.com'> 百度</a>";
    Spanned spanned = Html.fromHtml(s);
    mTv_html.setMovementMethod(LinkMovementMethod.getInstance());
    mTv_html.setText(spanned);
}

}

Android TextView的HTML及图片显示技巧 通过自定义和,我们可以控制网页的加载行为和响应各种网页事件。@Override// 在当前WebView中加载URL// 不调用系统浏览器加载URL});// 处理页面加载进度条更新等// 更新进度条});通过重写方法,可以决定是否在WebView中处理URL加载,而不是打开外部浏览器。 阅读详情

相关推荐

Android开发中的SpannableString应用技巧

SpannableString是CharSequence的一个实现,它可以对字符串中的特定字符或段落应用样式,如颜色、字体大小、粗体、斜体等。与传统的字符串不同,SpannableString不会因为样式的变化而创建新的字符串实例,因此在性能上更为优越,特别是在大量文本或在UI组件中频繁更新样式时。Span对象是Android中用于文本段落属性改变的一种机制。它提供了一种方式来设置特定文本范围的属性,而无需改变整个文本字符串。

weixin_36304957的博客 685

TextView富文本学习四 - 设置了SpannableString并设置了maxLines,内容变得可滑动解决办法

TextView设置了ClickableSpan并设置了maxLines,ellipsize="end"后,TextView的内容可滑动,当点击ClickableSpan的文本时TextView的内容也会自己滚动,很明显不符合大部分场景。要使ClickableSpan的click事件生效必须设置了MovementMethod,内部使用了LinkMovementMethod实例。 如何禁止滑动? 网...

lidongxiu0714 3028

智能织梦:基于Rokid AR眼镜的家庭情感记忆增强系统设计与实践

本文介绍了基于Rokid AR眼镜的'智能织梦'系统,通过增强现实技术捕捉和重现家庭情感记忆。系统利用多模态传感器和轻量级情感识别模型,自动记录家庭互动中的情感峰值时刻,并生成沉浸式记忆片段。测试数据显示,该系统显著提升了家庭情感互动的频率和质量,特别适用于多代同堂家庭和记忆唤醒场景。

sre5engineer的博客 536

Android TextView富文本SpannableStringBuilder的使用详解

在android开发过程中,做内容的时候,不仅只有字符,基本都是图文混排,升职个还会对内容中某段文字进行特殊处理,比如:字体加粗、字体变大、改变字体颜色、对某一段文字新增点击事件,等等。这些内容不可能通过一个一个view去拼接,这么复杂的SpannableStringBuilder:可生成字符串生成器,这是内容和标记都可以更改的文本类。常见的富文本修饰如:新增、删除、字体颜色、大小、背景色、图片、上标、下标、删除、点击等,接下来我们将介绍常用的一些 public SpannableStringBuilder

5884

Gromacs空蛋白模拟实战:从PDB文件到动力学轨迹的完整流程解析

本文详细解析了使用Gromacs进行空蛋白分子动力学模拟的完整实战流程。从PDB文件处理、力场选择与拓扑构建,到模拟盒子创建、溶剂化与电荷中和,再到能量最小化、NVT/NPT平衡及最终的生产模拟与基础分析,提供了每一步的命令详解和关键注意事项,旨在帮助计算生物学研究者系统掌握这一核心研究工具。

weixin_28454475的博客 275

【深度学习】通俗易懂讲解循环神经网络LSTM

目录 1、循环神经网络(Recurrent Neural Networks) 2、长依赖存在的问题 3、LSTM 网络 4、LSTMs的核心思想 5、一步一步理解LSTM 6、LSTM的变种 7、总结 1、循环神经网络(Recurrent Neural Networks) 人对一个问题的思考不会完全从头开始。比如你在阅读本片文章的时,你会根据之前理解过的信息来理解下面看到的文字。...

Nieson2012的专栏 2726

Android TextView 设置内容可滚动

前言 开发中scrollBar 用的最多的地方就是在内容超过显示区域后,可以手动上下左右滑动来查看 解决方案比较多。 方案一 使用一个可滑动的组件ScroolView包裹用于在内容超过显示区域后可滑动的布局。限制一个固定高度即可实现 <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/tv_bottom" android:l

Android 工程化与移动架构实践 1万+

【Cadence】 ADS Dynamic Link使用教程

在Cadence617上使用ADS Dynamic Link

乾巽的博客 6072

SpannableString&SpannableStringBuilder定制文本

除了上面的HTML可以定制我们TextView的样式外,还可以使用SpannableString和SpannableStringBuilder来完成,两者区别:前者针对的是不可变文本,而后者则是针对可变文本,这里只讲解前者,对后者有兴趣可自行查阅文本! SpannableString可供我们使用的API有下面这些: BackgroundColorSpan 背景色ClickableS

GL_X85的博客 426

告别AT串口线!用STM32F407的USB FS口直连EC800M进行物联网通信

本文介绍了一种创新的物联网通信方案,利用STM32F407的USB FS接口直连EC800M模块,替代传统的AT串口线连接。通过详细的硬件对比、STM32CubeMX配置和USB驱动调试步骤,展示了如何实现更高效的AT指令通信,同时降低硬件复杂度和功耗。

weixin_29189987的博客 705

webapi .net core8.0配置使用Token权限认证

本人在网上找了很多版本,不是太复杂就是不行。

m0_74824592的博客 1760

Android中String、StringBuffer与StringBuilder的比较

Java中同时提供String,StringBuffer,StringBuilder三种存放字符串的类型。 String的内容是不可变的,其他二者内容可变。每次给String做一些修改操作时,实际上重新构造了一个String. 按开发文档的说明,StringBuffer和StringBuilder的最大区别是,StringBuffer所有的访问都是synchronized,因此

大橙子的专栏 8725

《手把手教你YOLOv9实战》,改进专栏目录

为了提供友好的操作效果,本专栏将会手把手搭建可视化界面,我将用PyQt5 搭建一个可视化界面,可视化界面能够实现基本的图像加载与检测功能,如支持视频、摄像头,还支持更换不同的 YOLOv9 模型,并适应不同领域(如口罩检测系统、人脸检测系统、工业缺陷检测系统等),界面灵活、功能强大。通过YOLOv9加以改进设计,形成新的算法框架,一起水科研和论文,专栏会一直持续更新中,本专栏适合目标检测、分割、分类。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2148

Android TextView的各种Span

首先Span是什么 Span是功能强大的标记对象,可用于在字符或段落级别的文本设置样式.我们可以将该标记对象添加到文本上,从而可以改变文本的颜色,使文本可点击,缩放文本大小等等. 创建Span 创建一个Span,可以使用以下三个类SpannedString 使用该类创建的Span对象不可以改变文本,不可以改变标记.很少使用到.SpannableString 使用该类创建的Span对象不可改变文本,可以改变标记,一般在不修改文本内容,只修改文本标记的情况下(比如修改文本的颜色等)应该使用该类.Spann..

xujian197的博客 1680

DFIG风电场经LCC-HVDC外送系统SIMULINK建模与仿真

本文基于MATLAB/Simulink平台构建了DFIG风电场经LCC-HVDC外送系统的仿真模型。系统采用1000MW聚合DFIG模型与双极12脉动LCC-HVDC连接,详细阐述了参数设计、控制策略及接口协调方法。重点解决了风电场无功能力不足、功率波动影响换相等关键技术问题,为大规模风电基地外送提供了仿真研究框架。模型整合了官方DFIG和HVDC详细模块,通过参数缩放和控制系统优化,实现了完整系统的动态仿真分析。

huanghm88的专栏 118

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Android中的SpannableString,Spans以及TextView绘制原理

前言前段时间看过一篇 实现类似新浪微博帖子显示(2)——话题、@好友、表情解析工具类类似这种富文本的显示我们一般首先就会想到SpannableString,原作者也是这样实现的,就想着整理一下 相关知识.SpannableString与SpannableStringBuilder从名称来看一个是 builder, 一个是 string,很好理解.关于 SpannableString,Spannabl

BoBoMEe 6425

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Android 同一个TextView中多彩显示文字

写在前面 最近,在公司的项目中需要将一段文字分别涂上两种不同的颜色,最笨重的解决办法就是用多个TextView相互进行拼接显示,但是不光让业务逻辑变得繁杂,也让代码可靠性降低,因此本文介绍两种可以实现在同一个TextView下展示不同色彩的方法,如下图所示: 其中涉及到的是SpannableString等相关的类知识,当然String是一个既基础也复杂的对象类,所以在文章开头会阐述Stri...

yourzeromax的博客 963

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

android中绘制字符,如何在Android中使用Canvas.drawText绘制一个Spanned字符串

对于大多数人来这个问题,你应该使用一个StaticLayout提请您跨越文本。请参阅this answer寻求帮助。但是,如果你实际上需要绘制自己的跨区文本,那么你就需要loop through all the spanned ranges并分别绘制每一个。您还需要测量每个跨度中文本的长度,以便您知道从哪里开始绘制下一个跨度。下面的代码处理BackgroundColorSpan和Foregroun...

weixin_39534121的博客 769

Android spannableStringBuilder用法整理

装载自 点击打开链接

南魂09 667

Android - TextView动画加载文字

项目中有需求想让开屏Actvity 的Textview加载的时候有个从左到右的动画,其实很多地方也会用到。

m0_59482482的博客 1636

一文学会所有 Android TextView 属性,妈妈再也不担心我的代码写不好了!

飞哥语录:编程语言是人发明的东西,凡是人都应该懂人发明的东西,如果你不懂,那结论是:你不是人! Android 中我们知道有一个使用频率非常高的控件,它就是 TextView,但是它的属性特别多,今天我们就来探究下,它都有哪些属性。 1.android:autoLink 设置是否当文本为 URL 链接 /email/ 电话号码 /map 时,文本显示为可点击的链接。可选值(none/web/email/phone/map/all) 2.android:autoText 如果设置,将自动执行输入值的拼写纠.

「程序员飞飞」的博客 836

分析 TextView 应用 Spannable 风格后 ellipsize 属性失效

分析 TextView 应用 Spannable 风格后 ellipsize 属性失效 Author: nxliao(xtulnx@126.com) Date: 2013-05-20 环境: 为使 TextView 在超小号字体情况下不因 descent 导致纯中文和纯英文显示不在同一水平线,使用 spannable 风格: favorite.setText(info.get

xjlnx的专栏 4249

android 留言板 代码大全,Android API之TextView.BufferType代码演示

TextView.BufferType并不是TextView的内部类,是一个枚举类型,设置有三个枚举值,分别为NORMAL,EDITABLE,SPANNAABLE。对于EDITABLE,多用于在保存数据持久化,而SPANNAABLE则用于设置如TextView,EditText对象里的局部属性设置。而对于网络上关于EDITABLE之于NORMAL的差异,主要是说EDITABLE之后可以使用text...

weixin_35645460的博客 734

TextView使用技术点(一)

TextView作为开发时候显示最常用的控件之一,我们使用的频率是非常高的,但是我们平时的使用都是怎么使用的那些相关的属性和方法呢? 内容:setText() 字体:TextSize、TextColor 宽度和高度:width、weigth 边距:margin、padding 背景:background ...... 常用的基本也就这些吧。 虽然基本都用,但是我们真的了解这些属性和

android小菜 1万+

Android RecyclerView(回收视图)中使用Spannable该变文字颜色不生效问题

Spannable使用

一只小翊的博客 517
上一篇: andorid TextView(3)-使用HTML标签
下一篇: android TextView(5)-TextView一些其他常用效果
missingcall
博客等级 码龄10年 8粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值