AndroidFragment间对象传递
2015-10-24 19:40:12 | 来源:玩转帮会 | 投稿:佚名 | 编辑:小柯

原标题:AndroidFragment间对象传递

由于Activity相对较为笨重,因而在日常的开发中很多时候会用到Fragment。然而Activity之间是通过Intent进行数据的传递,那Fragment是通过什么来进行传递的呢?Fragment之间又是通过什么方式来进行对象的传递呢?

Android控件之间传递(Activity和Activity间传递对象、Fragment和Fragment间传递对象)对象有两种实现方式。一种是实现Java提供的Serializable接口,另一种是实现android提供的Parcelable接口。两者之间各有优势;实现 Serializable接口的话最简单,直接添加接口的实现即可,但是效率较低;实现Parcelable的话效率较高,但需要自己实现 Parcelable的方法。下面看下两种方法的具体实现:

原有Article类

package com.example.news.andoridnewsapp;
public class Article {
  private String title;
  private String linkmd5;
  private String link;
  private String desc;
  public String getLinkmd5() {
    return linkmd5;
  }
  public void setLinkmd5(String linkmd5) {
    this.linkmd5 = linkmd5;
  }
  public String getLink() {
    return link;
  }
  public void setLink(String link) {
    this.link = link;
  }
  public String getDesc() {
    return desc;
  }
  public void setDesc(String desc) {
    this.desc = desc;
  }
  public String getTitle() {
    return title;
  }
  public void setTitle(String title) {
    this.title = title;
  }
}

一、实现Serializable,只要在 public class Article后面添加接口的实现(implements Serializable )即可

package com.example.news.andoridnewsapp;
public class Article implements Serializable {
  private String title;
  private String linkmd5;
  private String link;
  private String desc;
  public String getLinkmd5() {
    return linkmd5;
  }
  public void setLinkmd5(String linkmd5) {
    this.linkmd5 = linkmd5;
  }
  public String getLink() {
    return link;
  }
  public void setLink(String link) {
    this.link = link;
  }
  public String getDesc() {
    return desc;
  }
  public void setDesc(String desc) {
    this.desc = desc;
  }
  public String getTitle() {
    return title;
  }
  public void setTitle(String title) {
    this.title = title;
  }
}

Fragment1进行参数传递

ArticleConententFragment fragment = new ArticleConententFragment();
Bundle args = new Bundle();
args.putSerializable(ARG_ARTICLE, article);
fragment.setArguments(args);

Fragment2进行参数的接收

(Article) getArguments().getSerializable(ARG_ARTICLE);

二、实现Parcelable,如果通过Parcelable的方式进行实现的话,需要实现Parcelable接口的方法describeContents(此方法一般不用修改)、writeToParcel(主要是此方法)和创建一个Creator属性。

package com.example.news.andoridnewsapp;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
//public class Article implements Serializable {
public class Article implements Parcelable {
  private String title;
  private String linkmd5;
  private String link;
  private String desc;
  public String getLinkmd5() {
    return linkmd5;
  }
  public void setLinkmd5(String linkmd5) {
    this.linkmd5 = linkmd5;
  }
  public String getLink() {
    return link;
  }
  public void setLink(String link) {
    this.link = link;
  }
  public String getDesc() {
    return desc;
  }
  public void setDesc(String desc) {
    this.desc = desc;
  }
  public String getTitle() {
    return title;
  }
  public void setTitle(String title) {
    this.title = title;
  }
  @Override
  public String toString() {
    return this.title;
  }
  @Override
  public int describeContents() {
    return 0;
  }
  @Override
  public void writeToParcel(Parcel dest, int flags) {
    Bundle bundle = new Bundle();
    bundle.putString("title", getTitle());
    bundle.putString("desc", getDesc());
    bundle.putString("link", getLink());
    bundle.putString("linkmd5", getLinkmd5());
    dest.writeBundle(bundle);
  }
  public static final Creator<Article> CREATOR = new Creator<Article>() {
    @Override
    public Article createFromParcel(Parcel source) {
      Bundle bundle = source.readBundle();
      Article article = new Article();
      article.setTitle(bundle.getString("title"));
      article.setDesc(bundle.getString("desc"));
      article.setLink(bundle.getString("link"));
      article.setLinkmd5(bundle.getString("linkmd5"));
      return article;
    }
    @Override
    public Article[] newArray(int size) {
      return new Article[size];
    }
  };
}

Fragment1进行参数传递

ArticleConententFragment fragment = new ArticleConententFragment();
Bundle args = new Bundle();
//args.putSerializable(ARG_ARTICLE, article);
args.putParcelable(ARG_ARTICLE, article);
fragment.setArguments(args);

Fragment2进行参数接收

//            mArticle = (Article) getArguments().getSerializable(ARG_ARTICLE);
            mArticle = (Article) getArguments().getParcelable(ARG_ARTICLE);

这样便可方便地实现对象参数的传递。其实传递的是一个Bundle对象,如果实现的是Serializable接口,则通过Bundle的 putSerializable和getSerializable进行设置和获取;如果实现的是Parceable接口,则通过putParceable 和getParceable进行设置和获取。

tags:

上一篇  下一篇

相关:

AndroidViewPager的使用总结

在一个窗口里面添加tab便签,完成便签切换来实现页面的切换,这样的好处是可以在同一个窗口里面有多个页面,

用IntelEdison模块做一个宝宝监视器

本文由玩赚乐(www.banghui.org)– 小峰原创翻译,转载请看清文末的转载要求,欢迎加入技术翻译小组!Intel&

居然还能这样——程序员加薪的新方法

我的朋友A君是个典型的.NET开发人员,技术不错,人品也不错,在一家小公司(姑且称为甲公司)做项目开发,是

下班约APP官方预告地址 约个女友来体验




下班约,是广州爱圈信息科技有限公司致力研发的一款工友社交App,为广大工友们提供一个

白米,糙米,有啥不同?

10月16日是世界粮食日,在这么“高大上”的日子里,让我们来聊聊关于吃饭的事吧!说到吃饭,人们最先想起的

帮你提升Python的27种编程语言

27 种语言过程型编程语言: C, Rust, Cython面向对象数据建模语言: Java, C#, EiffelC 的面向对象衍生语言:

Android动态加载技术三个关键问题详解

动态加载技术(也叫插件化技术)在技术驱动型的公司中扮演着相当重要的角色,当项目越来越庞大的时候,需要

如何才能成为一个好的技术领导者?

  近日,一名有超过15年软件开发经验的软件开发人员在Hacker News上提出了一个问题:如何才能成为一个好

黄加蓝,变绿!do加mi,咦怎么不变re

简而言之,问题的答案是这样的:人的听觉,感受到的就是声音的频谱,而 do+mi 的频谱与 re 的频谱完全不同。

我喜欢的人,都跟我有「夫妻相」,而且越来越像

从心理学的角度,喜欢跟自己长得像的人(所谓的夫妻相)是非常科学也非常正常的!再放宽一点说呢,人际交往

站长推荐: