在Android/Kotlin中,如何显示带有换行符的文本,但在用户选择并复制时剪贴板中不包含换行符?
也就是说,如果我有一个:
<TextView
android:id="@+id/recognized_text"
android:textIsSelectable="true"
/>
并且假设文本是:
val text = "a string with \n some text"
那么视图应该显示成两行:
a string with
some text
但当用户选择文本时,我希望在剪贴板中得到的是:
a string with some text
(其中不包含换行符)。用户可能只会选择部分文本,因此需要考虑到这一点。如果存在更好的方法,我们不一定非要使用TextView
。同时,它还应该像普通TextView
那样,长按文本时弹出菜单,并使用同样的复制选择按钮。
我曾考虑过使用<br>
标签代替\n
,但找不到任何关于这是否会改变行为的文档。我认为它可能不会改变这种行为。
要实现这个需求,可以自定义一个TextView子类,重写onTextContextMenuItem方法,特别针对COPY事件时替换文本中的换行符为无。这里给出一个示例代码:
class CustomCopyableTextView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : AppCompatTextView(context, attrs, defStyleAttr) {
init {
super.setTextIsSelectable(true)
}
override fun onTextContextMenuItem(id: Int): Boolean {
if (id == android.R.id.copy) {
val originalText = text.toString()
val clipboardText = originalText.replace("\n", "")
val clipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clipData = ClipData.newPlainText("Copied Text", clipboardText)
clipboardManager.primaryClip = clipData
return true
}
return super.onTextContextMenuItem(id)
}
}
然后在XML布局文件中使用这个自定义的CustomCopyableTextView
:
<com.yourpackage.CustomButtonCopyableTextView
android:id="@+id/recognized_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="a string with \n some text"/>
在剪贴板中(不含换行符)复制文本时,用户可能只选择文本的一部分,所以在设计时需要考虑到这一点。如果有更好的方案,我们可以不必局限于使用TextView
。此外,当长按文本时,也应该如同常规TextView
一样弹出菜单并显示复制选择按钮。
我也曾考虑过使用“<br>”标签替换“\n”,但没找到相关文档说明这样做是否会有所改变。我认为可能不会产生变化。