首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与Parceler一起使用Android注释

与Parceler一起使用Android注释
EN

Stack Overflow用户
提问于 2015-04-16 12:05:05
回答 2查看 3.5K关注 0票数 3

我在我的Android项目中使用了Android注释。由于实现Parcelable是很多工作,所以我想使用Parceler和@Parcel注释。

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

  • Parceler把生成的类放在哪里以便我可以使用这些类?在parceler.org上声明:“要使用生成的代码,可以直接引用生成的类,也可以通过Parcels实用程序类引用。”
  • 还有其他方法来使用Parceler或任何生成带有Android注释的Parcelable样板代码的库吗?

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

代码语言:javascript
复制
@EFragment(R.layout.fragment_faq)
public class FaqFragment extends ListFragment {
    @FragmentArg
    ArrayList<FaqItemImpl> faqItems;
    // ...
}

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

代码语言:javascript
复制
@Parcel
public class FaqItemImpl implements FaqItem {
    protected String iconURL;
    protected String title;
    protected String question;
    protected String answer;

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

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

代码语言:javascript
复制
// ...
public FaqFragment_.FragmentBuilder_ faqItems(ArrayList<FaqItemImpl> faqItems) {
        args.putSerializable(FAQ_ITEMS_ARG, faqItems);
        return this;
}
// ...

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-17 05:26:43

可以使用的一种方法是让AA处理Parcelable的切换,让Parceler执行序列化/反序列化。Parceler的一个好特性是它将为您处理集合序列化,因此AA只需处理一个Parcelable。这将有效地避免任何对生成代码的引用,当然,除了AA的下划线类。

我的意思是:

代码语言:javascript
复制
@EFragment(R.layout.fragment_faq)
public class FaqFragment extends ListFragment {
    @FragmentArg
    Parcelable faqParcelable;

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

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

代码语言:javascript
复制
FaqFragment_.builder()
  .faqParcelable(Parcels.wrap(faqItems))
  .build();

是的,这种方法不像AA为您做包装/解包调用那样好,但是它应该能工作。

编辑

通过与Android注释团队的合作,我们为@Extra@FragmentArg@SavedInstanceState带注释的字段添加了Parceler支持。这意味着OP所需的功能已经到位。这应该是可行的:

代码语言:javascript
复制
@EFragment(R.layout.fragment_faq)
public class FaqFragment extends ListFragment {
    @FragmentArg
    ArrayList<FaqItemImpl> faqItems;
    // ...
}
票数 3
EN

Stack Overflow用户

发布于 2015-04-16 15:58:53

不幸的是,您不能将@Parcelable对象与@FragmentArg (或其他AA包注入注释)结合使用。由于您使用的是FaqItemImpl,它本身并不实现Parcelable,AA无法知道如何处理它。一个(丑陋的)解决方案将使用生成的类:

代码语言:javascript
复制
@FragmentArg
ArrayList<FaqItemImpl.Parcelable> faqItems;

实际上,有一个尝试可以将parceler集成到AndroidAnnotations中,但是由于某些原因被拒绝了。

计划直接将Parcelable样板发生器添加到AA中,这就需要更多的前期工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29674199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档