Parceler - 无法找到SpannableString的读/写生成器

时间:2016-09-14 14:16:17

标签: android parceler

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 个答案:

答案 0 :(得分:1)

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

  1. 您需要将内部类定义为静态。 Parceler应该有更好的错误。
  2. 您需要注释构造函数参数。这是一个合法的错误,你应该能够注释。
  3. 您的ParcelConverter应该写入并读取SpannableString的内容,Parceler不会直接处理此类型。如果您测试它,这将导致运行时错误。
  4. 以下是您的代码的更新工作版本:

    @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