Parceler - 无法找到 SpannableString 的 read/write 生成器

Parceler - unable to find read/write generator for SpannableString

Error:(27, 64) error: Parceler: Unable to find read/write generator for type android.text.SpannableString for android.text.SpannableString span2
Error:(27, 87) error: Parceler: Unable to find read/write generator for type android.text.SpannableString for android.text.SpannableString span3
Error:(27, 41) error: Parceler: Unable to find read/write generator for type android.text.SpannableString for android.text.SpannableString span1

我在尝试构建项目时遇到上述错误。由于我使用的 类 是 SpannableString 我知道我需要一些我相信我已经实现的自定义序列化。有什么想法吗?

查看下面我的代码:

@Parcel
public class ParcelerTest
{
    @ParcelPropertyConverter(SpannableStringParcelConverter.class)
    public SpannableString span1;

    @ParcelPropertyConverter(SpannableStringParcelConverter.class)
    public SpannableString span2;

    @ParcelPropertyConverter(SpannableStringParcelConverter.class)
    public SpannableString span3;

    @ParcelConstructor
    public ParcelerTest(SpannableString span1, SpannableString span2, SpannableString span3)
    {
        this.span1 = span1;
        this.span2 = span2;
        this.span3 = span3;
    }

    public class SpannableStringParcelConverter implements ParcelConverter
    {
        @Override
        public void toParcel(Object input, android.os.Parcel parcel)
        {
            parcel.writeParcelable(Parcels.wrap(parcel), 0);
        }

        @Override
        public Object fromParcel(android.os.Parcel parcel)
        {
            return Parcels.unwrap(parcel.readBundle(getClass().getClassLoader()));
        }
    }
}

啊,这里有几个问题,有些是合法的错误:

  1. 您需要将内部 class 定义为静态。 Parceler 应该对此有更好的错误。
  2. 您需要注释构造函数参数。这是一个合法的错误,您应该能够对其中任何一个进行注释。
  3. 您的 ParcelConverter 应该写入和读取 SpannableString 的内容,Parceler 不直接处理这种类型。如果您对其进行测试,这将导致运行时错误。

这是您的代码的更新工作版本:

@Parcel
public class ParcelerTest
{
    public SpannableString span1;
    public SpannableString span2;
    public SpannableString span3;

    @ParcelConstructor
    public ParcelerTest(@ParcelPropertyConverter(SpannableStringParcelConverter.class) SpannableString span1,
                        @ParcelPropertyConverter(SpannableStringParcelConverter.class) SpannableString span2,
                        @ParcelPropertyConverter(SpannableStringParcelConverter.class) SpannableString span3)
    {
        this.span1 = span1;
        this.span2 = span2;
        this.span3 = span3;
    }

    public static class SpannableStringParcelConverter implements ParcelConverter<SpannableString>
    {
        @Override
        public void toParcel(SpannableString input, android.os.Parcel parcel)
        {
            parcel.writeString(input.toString());
        }

        @Override
        public SpannableString fromParcel(android.os.Parcel parcel)
        {
            return new SpannableString(parcel.readString());
        }
    }
}

此外,在您的代码库模型中使用 SpannableString 有点奇怪。也许你可以只使用普通的 String 来代替?