3

我在我的 Android 项目中使用 Android 注释。由于实现 Parcelable 需要做很多工作,我想使用 Parceler 和 @Parcel 注释。

问题是,如果我想通过 Android Annotations 使用 @FragmentArg 注释,它不会(出于显而易见的原因)认识到该类将在实现 Parcelable 接口的情况下生成。我现在有两个问题:

  • Parceler 将生成的类放在哪里以便我可以使用这些类?在 parceler.org 上声明:“要使用生成的代码,您可以直接引用生成的类,或通过 Parcels 实用程序类”
  • 是否有另一种方法可以使用 Parceler 或任何使用 Android Annotations 生成 Parcelable 样板代码的库?

到目前为止,我的 Fragment 代码如下所示:

@EFragment(R.layout.fragment_faq)
public class FaqFragment extends ListFragment {
    @FragmentArg
    ArrayList<FaqItemImpl> faqItems;
    // ...
}

生成的 POJO 类使用 @Parcel 进行注释:

@Parcel
public class FaqItemImpl implements FaqItem {
    protected String iconURL;
    protected String title;
    protected String question;
    protected String answer;

    protected ArrayList<FaqItemImpl> faqChildren;
    // ...
}

在生成的 FaqFragment_ 中,有趣的部分是:

// ...
public FaqFragment_.FragmentBuilder_ faqItems(ArrayList<FaqItemImpl> faqItems) {
        args.putSerializable(FAQ_ITEMS_ARG, faqItems);
        return this;
}
// ...

如您所见,生成的类将 POJO 视为可序列化...

4

2 回答 2

3

您可以使用的一种方法是让 AA 处理 Parcelable 的移交,并让 Parceler 执行序列化/反序列化。Parceler 的一个不错的功能是它将为您处理集合序列化,因此 AA 应该只需要处理单个 Parcelable。这将有效地避免对生成代码的任何引用,当然除了 AA 的下划线类。

这就是我的意思:

@EFragment(R.layout.fragment_faq)
public class FaqFragment extends ListFragment {
    @FragmentArg
    Parcelable faqParcelable;

    public void useFaq(){
        List<FaqItemImpl> faqItems = Parcels.unwrap(faqParcelable);
        // ...
    }
}

然后,当您准备好构建 FaqFragment 时,您只需让 Parceler 包装您的列表:

FaqFragment_.builder()
  .faqParcelable(Parcels.wrap(faqItems))
  .build();

是的,这种方法不如 AA 为您发出 wrap/unwrap 调用那么好,但它应该可以工作。

编辑

与 Android Annotation 团队合作,我们将 Parceler 支持添加到@Extra,@FragmentArg和带@SavedInstanceState注释的字段。这意味着 OP 所需的功能已经到位。这应该有效:

@EFragment(R.layout.fragment_faq)
public class FaqFragment extends ListFragment {
    @FragmentArg
    ArrayList<FaqItemImpl> faqItems;
    // ...
}
于 2015-04-17T05:26:43.850 回答
0

不幸的是,您不能使用@Parcelable带有@FragmentArg(或其他 AA 捆绑注入注释)的对象。由于您使用的是FaqItemImplwhich 本身没有实现Parcelable,所以 AA 不知道如何处理它。一个(丑陋的)解决方案将使用生成的类:

@FragmentArg
ArrayList<FaqItemImpl.Parcelable> faqItems;

其实有过融入的尝试,但由于某些原因被拒绝了。parcelerAndroidAnnotations

计划Parcelable样板生成器直接添加到 AA 中,不幸的是它需要更多的初始工作。

于 2015-04-16T15:58:53.393 回答