TextView中android:textIsSelectable属性的坑

首先TextView的这个属性到底是干什么的呢?
google开发文档关于android:textIsSelectable的描述是这样的

Indicates that the content of a non-editable text can be selected.

字面意思就是说让不可编辑的文本可以选中,笼统来讲就是说你使用这个属性后你就可以使用Android系统自带的复制功能。虽然这不是什么大的功能,但是还算常用。

然而这个属性本身存在一个叫坑的地方:
如果你设置这个属性为true后,你会发现你的android:ellipsize这个属性会出问题,同时你发现设置了最大行数,这个TextView中的文本居然还可以上下滑动,是不是很神奇?

这些都是android:textIsSelectable这个属性搞的鬼,让我们来看看这个属性设置后再代码上会有些什么调整:

public void setTextIsSelectable(boolean selectable) {
        if (!selectable && mEditor == null) return;
        createEditorIfNeeded();
        if (mEditor.mTextIsSelectable == selectable) return;
        mEditor.mTextIsSelectable = selectable;
        setFocusableInTouchMode(selectable);
        setFocusable(selectable);
        setClickable(selectable);
        setLongClickable(selectable);
        setMovementMethod(selectable ? ArrowKeyMovementMethod.getInstance() : null);
        setText(mText, selectable ? BufferType.SPANNABLE : BufferType.NORMAL);
        mEditor.prepareCursorControllers();
    }

感觉没什么,但是会发现这段代码中有一个方法很可疑setMovementMethod,看名字就可以感觉这是一个和移动有关的方法

/**
* Sets the movement method (arrow key handler) to be used for
* this TextView. This can be null to disallow using the arrow keys
* to move the cursor or scroll the view.
*


* Be warned that if you want a TextView with a key listener or movement
* method not to be focusable, or if you want a TextView without a
* key listener or movement method to be focusable, you must call
* {@link #setFocusable} again after calling this to get the focusability
* back the way you want it.
*/

这个方法的解释就是让TextView可滑动
最终的捣蛋者找到了就是因为setMovementMethod方法导致的问题,所以大家在使用这个属性的时候一定要注意自己的TextView是否需要设置最大高度。

你可能感兴趣的:(我遇到的坑)