Android Spanable:Edittext中的复制/剪切自定义跨距仅粘贴基类

Android Spanable:Edittext中的复制/剪切自定义跨距仅粘贴基类,android,android-edittext,spannable,text-styling,Android,Android Edittext,Spannable,Text Styling,我正在尝试扩展一些跨距,以便它们可能成为复合跨距(避免在一段文本上设置多个跨距),和/或存储更多关于它们自身的信息(如“类型”和“ID”等) 一切正常,直到我复制/剪切,然后粘贴文本。粘贴操作后,自定义跨距将丢失所有自定义,只保留特定于基础跨距的样式 例如,如果我扩展BackgroundColorSpan以始终应用红色文本颜色,它将起作用。将下面的扩展背景色span设置为任何文本都将正确设置背景,并且文本将根据需要显示为红色。以下是跨度的代码: public class ExtendedBack

我正在尝试扩展一些跨距,以便它们可能成为复合跨距(避免在一段文本上设置多个跨距),和/或存储更多关于它们自身的信息(如“类型”和“ID”等)

一切正常,直到我复制/剪切,然后粘贴文本。粘贴操作后,自定义跨距将丢失所有自定义,只保留特定于基础跨距的样式

例如,如果我扩展
BackgroundColorSpan
以始终应用红色文本颜色,它将起作用。将下面的
扩展背景色span
设置为任何文本都将正确设置背景,并且文本将根据需要显示为红色。以下是跨度的代码:

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被识别为普通
背景色Span
,而不是
扩展背景色Span

尝试从基类重写
writeToParcel(Parcel dest,int flags)
,同时使用可设置(非最终)
fgColor
(也设置它的构造函数),但没有任何效果

当我尝试使用额外信息(如特殊标记或id)创建自定义跨距时,我也遇到了这种情况。粘贴时会丢失额外的信息,甚至跨度的扩展类型

我错过了什么


编辑:这就是我所缺少的。以下内容来自Android开发者的ClipData.Item:

ClipData中单个项目的说明

单个项目当前可以包含的类型包括:

  • 文本:文本的基本字符串。这实际上是一个字符序列,所以它可以被相应的Android内置样式范围所支持的格式化文本。(不支持自定义应用程序跨距,在通过剪贴板传输时将被剥离。
(我的重点。)

我会让被接受的答案被接受,因为这正是我的正确方向


(意思是看我可能不能做什么,因为Android团队中有人认为我不能做。我最终得到了一个自定义
编辑文本
,带有自定义粘贴逻辑,以及复制/剪切/粘贴操作的回调,只是为了实现一些本来应该是操作系统工作的东西。整个平台感觉像是一个巨大的黑客。)

你激发了我对可扩展性的兴趣。没有机会扩展
背景色span
并实现自己的
包裹span
。框架不允许它,请检查它。否则我试图解决您的可复制问题,答案很简单:

 SpannableString spannableString = new SpannableString(firstEditText.getText().toString());
 spannableString.setSpan(new BackgroundColorSpan(Color.GREEN), 0, spannableString.length(), 0);
 spannableString.setSpan(new ForegroundColorSpan(Color.RED), 0, spannableString.length(), 0);

字符串可以在设置span之前复制粘贴包含,我已经检查过了。您可以将这两个span连接到一个类,并将其与其他颜色一起使用。

您是对的。我从未怀疑
ParcelableSpan
是不可扩展的:(太糟糕了。这就是为什么当时它不起作用的原因,当我试图直接实现它时,它与
UpdateAppearance
,直接从
CharacterStyle
扩展而来。我目前正在做一些像你建议的事情,我真正想要的不是必须这样做,而是能够用额外的非sta扩展跨类标准成员,例如标签,会让我的生活更轻松,代码也不会那么凌乱。:)我想到了一个丑陋的解决方法,我将观察复制/剪切事件,并在粘贴时重新应用类。上面的空间用完了-…:D无论如何,re:上面关于对事件作出反应的想法,我发现:它来自于这样的想法,但我只保存了要点,所以我不能相信起源…创建自己的可扩展对象会很神奇。但是你可以尝试一下使用可扩展对象传递列表实现您自己的可扩展生成器,选中“是”上的此类,这是基本思想,扩展
CharacterClass
,并实现您需要的所有接口。您可以通过这种方式轻松组合现有跨域,只需从原始源中复制您需要的任何内容。(大多数外观都是在
updateDrawState
中完成的)然后,您的span可以存储各种有用的东西,比如id、标记、(sub-)stypes等。唯一的问题是复制/粘贴,真的,但是使用上述要点,在剪切/复制时,将跨度边界保存在不同的缓冲区中,并在粘贴时重新应用它们是非常容易的。因此,我认为这是我甚至会为构建者解决的问题,TBH。你应该为此得到一个cookie。:D