【发布时间】:2018-07-11 12:19:36
【问题描述】:
我正在尝试扩展一些 Span,以便它们可能变得复合(以避免必须在一段文本上设置多个 Span),和/或存储更多关于它们自己的信息(例如,“类型”和“ID”,等等)
一切都按预期工作,直到我复制/剪切,然后粘贴文本。在粘贴操作之后,自定义 span 将失去所有自定义,只保留 base-span 特定的样式。
例如,如果我扩展 BackgroundColorSpan 以始终应用红色文本颜色,它将起作用。将下面的Extended BackgroundColorSpan 设置为任何文本都将正确设置背景,并且文本将根据需要变为红色。这是跨度的代码:
public class ExtendedBackgoundColorSpan extends BackgroundColorSpan {
private final int fgColor = Color.parseColor("#FF0000");
public ExtendedBackgoundColorSpan(int color) {
super(color);
}
public ExtendedBackgoundColorSpan(Parcel src) {
super(src);
}
/*Make text colour red*/
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(fgColor);
}
}
一切都很好,直到我复制/剪切然后粘贴跨区文本。然后它将失去其“红色”,但保留背景颜色。此外,粘贴的 Span 被识别为普通的 BackgroundColorSpan,而不是 ExtendedBackgroundColorSpan。
尝试使用可设置(非最终)fgColor 从基类覆盖 writeToParcel(Parcel dest, int flags)(也设置它的构造函数),但没有任何效果。
当我尝试使用额外信息(如特殊标签或 id)创建自定义跨度时,我也遇到了这种情况。粘贴时会丢失额外的信息,甚至跨度的扩展类型。
我错过了什么?
编辑:这就是我所缺少的。以下来自Android开发者ClipData.Itemhere:
ClipData 中单个项目的描述。
单个项目当前可以包含的类型有:
- 文本:基本的文本字符串。这实际上是一个 CharSequence,因此它可以是相应 Android 内置样式跨度支持的格式化文本。 (不支持自定义应用程序跨度,并且在通过剪贴板传输时将被剥离。)
(强调我的。)
我将接受已接受的答案,因为这为我指明了正确的方向。
<rant> (意思是看看我可能不能做什么,因为 Android 团队的某个人认为我不应该这样做。我最终得到了一个自定义 EditText,使用自定义粘贴逻辑和复制/剪切/粘贴操作的回调,只是为了实现一些本来应该是操作系统工作的东西。整个平台感觉就像一个巨大的黑客。)</rant>
【问题讨论】:
标签: android android-edittext spannable text-styling