在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