在项目中,可能会用到TextView的超链接和复制粘贴的功能,实现方式:
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autoLink="all" // 实现所有超链接
android:textIsSelectable="true"// 实现复制粘贴
/>
当两者同时使用的时候,并且textview中的文本是多个超链接时,点击时就会出现问题
。
现象是:点击第一个超链接动作是正常的,当点击第二个超连接时,响应的动作是第一个超链接。当再次点击第一个链接时,响应的动作是第二个超链接。
关于这个其实可以看做是一个SDK本身的Bug。textView设置超链接,其实是调用
TextView.setMovementMethod(MovementMethod movement)
给TextView设置了LinkMovementMethod
,实现点击效果,如果不明白LinkMovementMethod
的作用,自行百度。
当TextView在实现复制粘贴时,通过查看TextView的源码,发现Method被改变了·······
public void setTextIsSelectable(boolean selectable) {
if (!selectable && mEditor == null) return; // false is default value with no edit data
createEditorIfNeeded();
if (mEditor.mTextIsSelectable == selectable) return;
mEditor.mTextIsSelectable = selectable;
setFocusableInTouchMode(selectable);
setFocusable(FOCUSABLE_AUTO);
setClickable(selectable);
setLongClickable(selectable);
// mInputType should already be EditorInfo.TYPE_NULL and mInput should be null
setMovementMethod(selectable ? ArrowKeyMovementMethod.getInstance() : null); <-----这里
setText(mText, selectable ? BufferType.SPANNABLE : BufferType.NORMAL);
// Called by setText above, but safer in case of future code changes
mEditor.prepareCursorControllers();
}
为了避免上面的现象,我采用的做法是,在xml中只设置超链接
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autoLink="all" // 实现所有超链接
/>
然后在代码中
textView.setTextIsSelectable(true)
textView.movementMethod = LinkMovementMethod.getInstance()
这样就可以解决这个问题了。