其他分享
首页 > 其他分享> > 在Parceler中使用Android注释

在Parceler中使用Android注释

作者:互联网

我在Android项目中使用Android注释.由于实现Parcelable的工作量很大,因此我想使用Parceler和@Parcel批注.

问题是,如果我想使用Android Annotations的@FragmentArg注释,则(出于显而易见的原因)无法识别该类将在实现Parcelable接口的情况下生成.
我现在有两个问题:

> Parceler会将生成的类放在哪里,以便我可以使用它们?在parceler.org上说明:“要使用生成的代码,您可以直接或通过Parcels实用程序类引用生成的类”
>还有其他方法可以使用Parceler或任何使用Android Annotations生成Parcelable样板代码的库吗?

到目前为止,我的“片段”代码如下所示:

@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视为可序列化…

解决方法:

您可以使用的一种方法是让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包装您的List:

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

是的,这种方法不如AA为您进行包装/展开请求的方法,但它应该可以工作.

编辑:

我们与Android注释团队合作,在@ Extra,@ FragmentArg和@SavedInstanceState注释字段中添加了Parceler支持.这意味着OP所需的功能已经到位.这应该工作:

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

标签:parcelable,parceler,android-annotations,android
来源: https://codeday.me/bug/20191120/2044265.html