【问题标题】:Parceler - unable to find read/write generator for SpannableStringParceler - 无法找到 SpannableString 的读/写生成器
【发布时间】:2016-09-16 08:40:40
【问题描述】:
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()));
        }
    }
}

【问题讨论】:

    标签: android parceler


    【解决方案1】:

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

    1. 您需要将内部类定义为静态。 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      • 2020-11-13
      相关资源
      最近更新 更多