Spannable与Editable区别

Stella981
• 阅读 586

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

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

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

Editable: Spannable与Editable区别 Spannable: Spannable与Editable区别

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

Spannable与Editable区别

由图可见,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: Spannable与Editable区别

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 !

点赞
收藏
评论区
推荐文章
Irene181 Irene181
3年前
一篇文章带你搞懂Python中的继承和多态
一、继承的介绍继承是一种创建新的类的方式,新创建的叫子类,继承的叫父类、超类、基类。继承的特点就是子类可以使用父类的属性(特征、技能)。继承是类与类之间的关系。继承可以减少代码冗余、提高重用性。在现实生活中,继承一般指的是子女继承父辈的财产,如下图:二、如何用继承?1.继承语法Class派生类名(基类名):基类名写在括号里。在继承关系中,已有的,设计好
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java 07 接口
1.interface    接口2.接口中的成员修饰符固定  publicstaticfianl  //成员变量  只通过类访问   publicabstract    //成员函数   3.接口里所有的方法都是抽象的,抽象类中,可以没有抽象方法。  类与类继承,类与接口是实现的关系。降低耦合(高
Stella981 Stella981
3年前
Spring Security使用详解5(角色继承)
之前的文章中,各个角色之间不具备任何关系,但一般来说角色之前是有关系的,例如ROLE\_admin一般既有admin的权限,又具有user的权限。下面介绍如何配置这种角色之间相互继承的关系。五、角色继承1、配置角色关系要配置角色继承关系,只需在SpringSecurity的配置类中提供一个RoleHierar
Wesley13 Wesley13
3年前
Java——类之间的关系
3.7类之间的关系3.7.1泛化关系 类和类之间的继承关系及接口与接口之间的继承关系。!(https://oscimg.oschina.net/oscnet/a5fa467c0401d4d7c7525fa4ab75fa4c672.png) !(https://oscimg.oschina.net/oscnet/9
Stella981 Stella981
3年前
EXTJS的combo组件的下拉选项框的高度和垂直滚动条如何设置
var testCombo  Ext.create('Ext.form.field.ComboBox', {        displayField : 'name',        valueField : 'code',        editable : false,        store : te
Wesley13 Wesley13
3年前
C++ ORM ODB 入门介绍(二)
本节主要介绍ODB中的继承和C之间的关系。ORM中的O的关系是很复杂的。其中之一便是对象的继承体系。在C语言中支持类之间的继承,这这些继承的关系是否可以同时映射到数据库呢?1\.ODB中的继承类型ODB支持2中继承类型,abstract和polymorphic。根据ODB文档的描述,abstract方式为
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
Java基础28
1/2继承的概述:31.提高了代码复用性,简化了代码42.让类与类之间产生了继承关系,才有了后面的多态特性的存在5注意:千万不要为了获取其他类的功能简化代码,而建立继承关系,必须要类与类之间存在继承关系,继承关系:isa67子类拥有父类的成员,子类不能拥有父类
Easter79 Easter79
3年前
StringRedisTemplate操作redis数据
StringRedisTemplate与RedisTemplate区别点两者的关系是StringRedisTemplate继承RedisTemplate。两者的数据是不共通的;也就是说StringRedisTemplate只能管理