Parceler - не удалось найти генератор чтения / записи для 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 ответ

Решение

Ах, здесь есть пара проблем, некоторые из них законные ошибки:

  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 вместо?

Другие вопросы по тегам