我们知道,『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);
效果如下:
虽然这种方式设置十分简单,但仅能够满足基本要求,如果需求的复杂度增加,依然会产生一些坑。