我们知道,『WeChat』内可以通过双击聊天内容对文本进行选择和复制操作:

微信对聊天文本的操作

而 Android 中 TextView 在默认模式下是不支持长按选择的,那么这个操作是如何实现的呢?

网上大多数教程都是利用自定义一个继承自 EditText 的控件来实现,或者直接在布局文件中修改 EditText 的控件属性:

<EditText
    ...
    android:background="@null"
    android:editable="false"
    android:textCursorDrawable="@null" />

目的是使 EditText 取消底部横线背景、不可进行编辑以及取消游标闪烁,以达到伪装成 TextView 的效果。实际上 EditText 也的确是继承自 TextView

宏观来说,XML 是一种可扩展标记语言,用元素和属性来描述数据,而不提供数据的显示方法。所以我个人并不太喜欢这种方式,这会给代码带来歧义。相比之下,自定义 View 还是会更合理一些。

但实际上 TextView 本身从 API 11 开始就支持长按选择,只需要设置属性即可:

<TextView
    ...
    android:textIsSelectable="true" />

当然,也支持在逻辑中动态设置:

textView.setTextIsSelectable(true);

效果如下:

可选择的 TextView

虽然这种方式设置十分简单,但仅能够满足基本要求,如果需求的复杂度增加,依然会产生一些坑。