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()));
}
}
}
啊,这里有几个问题,有些是合法的错误:
- 您需要将内部 class 定义为静态。 Parceler 应该对此有更好的错误。
- 您需要注释构造函数参数。这是一个合法的错误,您应该能够对其中任何一个进行注释。
- 您的 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
来代替?
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()));
}
}
}
啊,这里有几个问题,有些是合法的错误:
- 您需要将内部 class 定义为静态。 Parceler 应该对此有更好的错误。
- 您需要注释构造函数参数。这是一个合法的错误,您应该能够对其中任何一个进行注释。
- 您的 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
来代替?