Not all text classes have mutable markup or text; * see {@link Spannable} for mutable markup and {@link Editable} for * mutable text. */ public interface Spanned extends CharSequence Spannable (可加或去除标记的字符序列 * Not all Spannable classes have mutable text; * see {@link Editable} for that. */ public interface Spannable extends Spanned Editable (内容和标记都可变的字符序列) /** * This is the interface for text whose content and markup can be changed */ public interface Editable extends CharSequence, GetChars, Spannable,
Spannable / 富文本的用途 丰富 Android TextView 的表现形式,如修改同一主体中某一部分文字的颜色、大小、样式、添加超链接以及添加图标,使得 TextView 功能与表现形式更强大 Spannable / 富文本的实现 1. ForegroundColorSpan 修改前景色 ? 2. RelativeSizeSpan 修改文字大小(相对) ? 3.
ForegroundColorSpan(Color.RED); spannable.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ); spannable.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); setText(spannable); (span_1, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); spannable.setSpan(span_2, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ); spannable.setSpan(span_1, end+1, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); span_2= ); } return spannable; }
/** * replace existing spannable with smiles * * @param context 上下文 * @param spannable 显示的span * @return 是否添加 */ public static boolean addSmiles(Context context, Spannable spannable) { boolean (context, spannable); return spannable; } TextCommonUtils 处理文本显示的逻辑 1、URL和纯数字 有时候,一个女朋友是不够的,额··· resolveUrlLogic(Context context, TextView textView, Spannable spannable, int color, SpanUrlCallBack spannable = TextCommonUtils.getEmojiText(context, text); editText.setText(spannable); //查找@
maxWidth,如果比maxWidth大,那就追加一个换行符号,然后再把累加长度归零,继续开始计算,以此类推 图文混排实现 TextView中有一个概念就是富文本,富文本可以实现图文混排,代码如下: Spannable spannable = Spannable.Factory.getInstance().newSpannable(sbNewText.toString()); ImageSpan imageSpan = new ImageSpan(b); spannable.setSpan(imageSpan, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); setText(spannable ); Spannable是根据当前TextView的文本内容创建出来的,然后可以用ImageSpan去替换Spannable中的任意一个位置 文本缩进实现 依然是用TextView的富文本Spannable 去实现,代码如下: Spannable spannable = Spannable.Factory.getInstance().newSpannable(sbNewText.toString()); BitmapDrawable
// if setText was called with BufferType.SPANNABLE textView.setText(spannable, BufferType.SPANNABLE)/ / the text can be cast to Spannable val spannableText = textView.text as Spannable// now we can set or 在上面的方案2中,我们看到通过textView.setText(spannableObject,BufferType.SPANNABLE)设置文本时,TextView通过使用Spannable.Factory 如果你想对这个过程进行更多的控制,避免额外的对象创建,可以实现你自己的Spannable.Factory,覆盖newSpannable(CharSequence),并将Spannable.Factory : Spannable { return source as Spannable } } 在得到TextView的引用后,立即设置Spannable.Factory对象一次。
// 如果 setText 被以 BufferType.SPANNABLE 方式调用 textView.setText(spannable, BufferType.SPANNABLE) // 文字可被转为 Spannable val spannableText = textView.text as Spannable // 现在我们可以设置或删除 span spannableText.setSpan( 在上面的选项 2 中,我们看到在通过 textView.setText(spannableObject, BufferType.SPANNABLE) 设置文字时,TextView.Spannable.Factory : Spannable { return source as Spannable } } 在你获取 TextView 的引用之后,立即设置 Spannable.Factory 这允许你在后台线程中创建 Spannable 对象,并做完需要对列表元素做的所有操作。你的Adapter 可以持有对 List<Spannable> 的一个引用。
flags:取值有如下四个 Spannable. SPAN_INCLUSIVE_EXCLUSIVE:前面包括,后面不包括,即在文本前插入新的文本会应用该样式,而在文本后插入新文本不会应用该样式 Spannable. SPAN_INCLUSIVE_INCLUSIVE:前面包括,后面包括,即在文本前插入新的文本会应用该样式,而在文本后插入新文本也会应用该样式 Spannable. SPAN_EXCLUSIVE_EXCLUSIVE:前面不包括,后面不包括 Spannable. ForegroundColorSpan(Color.parseColor("#009ad6")); spannableString.setSpan(colorSpan, 0, 8, Spannable.SPAN_EXCLUSIVE_INCLUSIVE
被标记为了黄色 对应的代码为 int index = warnInfo.indexOf("\n"); if (index <= ){ index = warnInfo.length(); } spannable.setSpan (clickableSpanMember,,,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); spannable.setSpan(clickableSpanSource,,index ,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); Spanned.SPAN_EXCLUSIVE_EXCLUSIVE (前后都不包括)。 这部分代码编译和运行的时候都不会出错,但是使用Appium进行元素查找的时候就会出错 改为先判断字符长度然后设置点击事件: if (warnInfo.length() >){ spannable.setSpan (clickableSpanSource,,index,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } 修改之后Appium可以正常查找元素,不会出现APP奔溃现象
为红色 spannableString.setSpan( ForegroundColorSpan(Color.RED), 0, // 开始索引 5, // 结束索引 Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 'Android Developers' 为粗体 spannableString.setSpan( StyleSpan(Typeface.BOLD), 7, 25, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ) // 给文本 'Developers' 添加下划线 spannableString.setSpan( UnderlineSpan(), 15, 25, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE // 'Big' 字段相对比例放大1.5倍 spannableStringSize.setSpan( RelativeSizeSpan(1.5f), 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ) // 设置粗体文字 comprehensiveSpannable.setSpan( StyleSpan(Typeface.BOLD), 4, 8, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
TextView是用来显示文本的,有时需要给TextView中的个别字设置为超链接,或者设置个别字的颜色、字体等,那就需要用到Spannable对象,可以借助Spannable对象实现以上设置 myTextView Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //设置高亮样式一 sp.setSpan(new BackgroundColorSpan(Color.RED), 17 ,19,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ); //设置高亮样式二 sp.setSpan(new ForegroundColorSpan(Color.YELLOW),20,24,Spannable.SPAN_EXCLUSIVE_INCLUSIVE ); //设置斜体 sp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 27, 29, Spannable.SPAN_EXCLUSIVE_INCLUSIVE
用Spannable或实现它的类,如SpannableString来格式部分字符串。 tv.setMovementMethod(LinkMovementMethod.getInstance()); CharSequence text = tv.getText(); if (text instanceof Spannable ){ int end = text.length(); Spannable sp = (Spannable)tv.getText(); URLSpan ; style.setSpan(myURLSpan,sp.getSpanStart(url),sp.getSpanEnd(url),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ); style.setSpan(new ForegroundColorSpan(0xFFFF0000), start, end, Spannable.SPAN_INCLUSIVE_INCLUSIVE
CharSequence text = holder.txt_comment.getText(); int ends = text.length(); Spannable spannable = (Spannable) holder.txt_comment.getText(); URLSpan[] urlspan = spannable.getSpans (url), spannable.getSpanEnd(url), spannable.SPAN_EXCLUSIVE_EXCLUSIVE); spannable = (Spannable) holder.txt_comment.getText(); URLSpan[] urlspan = spannable.getSpans (url), spannable.getSpanEnd(url), spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
= 0) { Spannable s2; if (type == BufferType.EDITABLE || text instanceof Spannable) { s2 = (Spannable) text; } else { s2 = mSpannableFactory.newSpannable( BufferType.EDITABLE : BufferType.SPANNABLE; /* * We must go ahead and set the = null || onCheckIsTextEditor()) && isEnabled() && mText instanceof Spannable && mLayout Spannable spannable = (Spannable) text; ClickableSpan[] clickableSpans = spannable.getSpans
CharSequence text = holder.txt_comment.getText(); int ends = text.length(); Spannable spannable = (Spannable) holder.txt_comment.getText(); URLSpan[] urlspan = spannable.getSpans (url), spannable.getSpanEnd(url), spannable.SPAN_EXCLUSIVE_EXCLUSIVE); spannable = (Spannable) holder.txt_comment.getText(); URLSpan[] urlspan = spannable.getSpans (url), spannable.getSpanEnd(url), spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
LinkMovementMethod.getInstance()); CharSequence text = tv.getText(); if(text instanceof Spannable ){ int end = text.length(); Spannable sp = (Spannable)tv.getText(); for(URLSpan url : urls){ style.setSpan(url,sp.getSpanStart(url),sp.getSpanEnd(url), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE "#FF12ADFA")); style.setSpan(colorSpan,sp.getSpanStart(url),sp.getSpanEnd(url), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ),tv),url.getSource()); style.setSpan(span,sp.getSpanStart(url),sp.getSpanEnd(url), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
sb = new SpannableStringBuilder("字体多种颜色一&背景色"); sb.setSpan(new ForegroundColorSpan(Color.RED),0,2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ); sb.setSpan(new ForegroundColorSpan(Color.YELLOW),2,5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); sb.setSpan (new ForegroundColorSpan(Color.BLUE), 5, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //背景色 sb.setSpan(new BackgroundColorSpan(Color.GREEN), 7, sb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); mTextView4.setText
1 介绍 SpannableString SpannableString 继承于 SpannableStringInternal,同时实现了 CharSequence, GetChars, Spannable 数学公式会用到) TextAppearanceSpan 文本外貌(包括字体、大小、样式和颜色) TypefaceSpan 文本字体 URLSpan 文本超链接 flags 也有四个参数,分别是: 1) Spannable.SPAN_EXCLUSIVE_EXCLUSIVE :前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式 2) Spannable.SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,后面包括。 即仅在范围字符的后面插入新字符时会应用新样式 3) Spannable.SPAN_INCLUSIVE_EXCLUSIVE:前面包括,后面不包括。 4) Spannable.SPAN_INCLUSIVE_INCLUSIVE:前后都包括。 3 代码实现 这么多消息,当然需要一个列表来呈现。
blackSpan = new ForegroundColorSpan(Color.parseColor("#000000")); builder.setSpan(buleSpan1, 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE ); builder.setSpan(blackSpan, 5, 7, Spannable.SPAN_INCLUSIVE_INCLUSIVE); builder.setSpan(buleSpan, 7, 12, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); builder.setSpan(blackSpan,12, 17, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
这里同样使用Spannable,我定义了一个DataBindingSpan<T>接口,主要有两个功能: 1)让用户提供一个CharSequence对象作为标签,它决定了标签文本的样式和内容; 2)提供一个方法返回 正如SpannableData所展现的一样,当spannedText()返回的是一个Spannable对象时,使用Spanned.SPAN_EXCLUSIVE_EXCLUSIVE作为flag。 既然选中状态的实现是Span,它就是与View无关的,而与Spannable有关。 , start: Int, end: Int) { } override fun onSpanAdded(text: Spannable?, what: Any? fun isDirty(text: Spannable): Boolean } 其次,让SpannableData实现此接口。