文档章节

Spannable与Editable区别

幻海流心
 幻海流心
发布于 2017/01/22 17:06
字数 486
阅读 27
收藏 0

在看TextView源码时候又看到了这两个接口:Spannable和Editable;

之前一直没有认真研究过两者的关系,现在看了源码记录下来。

1:两者属于继承关系,Editable继承于Spannable

Editable: Editable继承关系.png Spannable: Spannable.png

相较于Spannable,Editable还继承了另2个接口:CharSequence,Appendable。 CharSequence大家应该比较熟,看一下Appendable:

Appendable.png

由图可见,Appendable这个接口,主要用来向CharSequence 添加/插入新的文本,通过其定义的方法可以看出其作用:

  • append(CharSequence csq)
  • append(CharSequence csq, int start, int end)
  • append(char c)

2:Spannable中主要方法

  • setSpan(Object what, int start, int end, int flags)
    • 这个方法我们经常用,用于向文本设置/添加新的样式
  • removeSpan(Object what)
    • 移除指定的样式,作用和setSpan相反

由此可见,Spannable作用是为CharSequence实例设置或者移除指定样式

2:Editable中主要方法

Editable: Editable源代码.png

This is the interface for text whose content and markup can be changed: 可见,Editable接口关联的文本,不仅可以标记/设置样式,其内容也可以变化;

3:实际使用总结

  • 如果一段文本,仅仅是样式发生变化,使用Spannable的子类SpannableString即可实现
  • 如果一段文本,样式和内容都要发生变化,则必须使用Editable实例,我们最常用的应该就是SpannableStringBuilder.
  • 调用TextView实例的setText方法时,type使用TextView.BufferType.EDITABLE,可以实现TextView中的文本不断的增加/更新(比如一些场景是需要向TextView实例中不断插入从网络获取的最新数据
/**
     * Sets the text that this TextView is to display (see
     * {@link #setText(CharSequence)}) and also sets whether it is stored
     * in a styleable/spannable buffer and whether it is editable.
     *
     * @attr ref android.R.styleable#TextView_text
     * @attr ref android.R.styleable#TextView_bufferType
     */
    public void setText(CharSequence text, BufferType type) {
        setText(text, type, true, 0);

        if (mCharWrapper != null) {
            mCharWrapper.mChars = null;
        }
    }

示例代码:

    .................    
        tv_setText = (TextView) findViewById(R.id.tv_setText);
        bt_setText = (Button) findViewById(R.id.bt_setText);
        tv_setText.setText("", TextView.BufferType.EDITABLE);
        bt_setText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Editable content = (Editable) tv_setText.getText();
                content.append(":"+(insertIndex++));
            }
        });
    }
    int insertIndex = 0;

That's all !

本文转载自:http://www.jianshu.com/p/536c3662a95c

幻海流心
粉丝 0
博文 11
码字总数 34391
作品 4
私信 提问
Canvas上drawText的进阶

前言 使用Canvas的drawText绘制文本是不会自动换行的,即使一个很长很长的字符串,drawText也只显示一行,超出部分被隐藏在屏幕之外。 那么TextView这样的控件是如何处理这个问题的呢?实际上...

街角的小丑
2018/05/17
307
0
Android端IM应用中的@人功能实现:仿微博、QQ、微信,零入侵、高可扩展[图文+源码]

本文由“猫爸iYao”原创分享,感谢作者。 1、引言 最近有个需求:评论@人(没错,就是IM聊天或者微博APP里的@人功能),就像下图这样: 网上已经有一些文章分享了类似功能实现逻辑,但是几乎...

JackJiang2011
2018/12/23
0
0
Android端IM应用中的@人功能实现:仿微博、QQ、微信,零入侵、高可扩展

本文由“猫爸iYao”原创分享,感谢作者。 1、引言 最近有个需求:评论@人(没错,就是IM聊天或者微博APP里的@人功能),就像下图这样: ▲ 微信群聊界面里的@人功能 ▲ QQ群聊界面里的@人功能...

首席大胸器
2018/12/23
67
0
TextView的日常使用技巧

Textview在日常开发工作中使用非常频繁,在这里简单总结一下其比较重要的用法。目标是设置textview的中一段文字的显示属性,例如指定文字要下划线显示(@XXX、#XXX#),文字替换成图片,文字...

zhiweiofli
2013/07/05
505
0
Android 如何优雅地实现@人功能?

最近有个需求:评论@人。网上已经有一些文章分享了类似功能实现逻辑,但是几乎都是扩展EditText类,这种实现方式肯定不能进入我的首发阵容。你以为是因为它不符合面向对象六大原则?错,只因...

猴亮屏
2018/12/12
35
0

没有更多内容

加载失败,请刷新页面

加载更多

3_数组

3_数组

行者终成事
38分钟前
7
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部