当前位置: 首页 > news >正文

Android Fragment间对象传递

  由于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进行设置和获取。

相关文章:

  • windows下sublime text的node.js开发环境搭建
  • 关于PHP设计模式的分析和理解
  • ibatis设置启用及关闭命名空间
  • struts1和struts2的区别对比
  • HA集群之三:corosync+pacemaker实现httpd服务的高可用(crm的用法)
  • VmWare10 32位安装CentOS7遇到的问题及解决办法
  • 百度地图查询数据结果
  • AngularJs angular.element
  • CUDA学习笔记(五)
  • JVM探索(二)
  • Android布局
  • BootstrapValidator验证表单用法
  • Sublime text3官方插件汉化过程
  • PhantomJS快速入门
  • 破窗效应-谁在打破第一扇窗户?(转)
  • ES学习笔记(12)--Symbol
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Java-详解HashMap
  • Kibana配置logstash,报表一体化
  • LeetCode算法系列_0891_子序列宽度之和
  • Linux gpio口使用方法
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Sass 快速入门教程
  • Travix是如何部署应用程序到Kubernetes上的
  • TypeScript实现数据结构(一)栈,队列,链表
  • XForms - 更强大的Form
  • 仿天猫超市收藏抛物线动画工具库
  • 回顾 Swift 多平台移植进度 #2
  • 你不可错过的前端面试题(一)
  • 一道闭包题引发的思考
  • Mac 上flink的安装与启动
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • (26)4.7 字符函数和字符串函数
  • (4) PIVOT 和 UPIVOT 的使用
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (C语言)二分查找 超详细
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (Forward) Music Player: From UI Proposal to Code
  • (JS基础)String 类型
  • (附源码)springboot太原学院贫困生申请管理系统 毕业设计 101517
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (南京观海微电子)——I3C协议介绍
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)socket Aio demo
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • . NET自动找可写目录
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET Core跨平台微服务学习资源
  • .net framework4与其client profile版本的区别
  • .NET NPOI导出Excel详解
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • @Autowired和@Resource的区别
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现