知识 | 解析今日看点Android开发

Spannable与Editable区别

2017-01-22  本文已影响618人  幻海流心

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

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

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

Editable:


Editable继承关系.png

Spannable:


Spannable.png

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

Appendable.png

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

2:Spannable中主要方法

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

2:Editable中主要方法

Editable:


Editable源代码.png

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

3:实际使用总结

/**
     * 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;
        .................
        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) {
                tv_setText.append(":"+(insertIndex++));
            }
        });

原因:在调用append方法时候,append方法内部会自动设置为TextView.BufferType.EDITABLE

append方法.png

That's all !

上一篇 下一篇

猜你喜欢

热点阅读