Spannable與Editable區別

在看TextView源碼時候又看到了這兩個接口:Spannable和Editable;android

以前一直沒有認真研究過二者的關係,如今看了源碼記錄下來。網絡

1:二者屬於繼承關係,Editable繼承於Spannable

Editable: Editable繼承關係.png Spannable: Spannable.pngapp

相較於Spannable,Editable還繼承了另2個接口:CharSequence,Appendable。 CharSequence你們應該比較熟,看一下Appendable:ide

Appendable.png

由圖可見,Appendable這個接口,主要用來向CharSequence 添加/插入新的文本,經過其定義的方法能夠看出其做用:ui

  • 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實例設置或者移除指定樣式this

2:Editable中主要方法

Editable: Editable源代碼.pngspa

This is the interface for text whose content and markup can be changed: 可見,Editable接口關聯的文本,不只能夠標記/設置樣式,其內容也能夠變化;code

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 !接口

相關文章
相關標籤/搜索