开发之中用到的Fragment的次数越来越多,很多小的项目都已经直接在使用Fragment作为Activity的载体来切换页面。而在开发之中页面的切换我们最关心的问题就是数据的传递了。今天我们主要来研究下Fragment页面切换数据的传递方式。

第一种方式:Bundle传递参数

Fragment1 fragment1 = new Fragment1();
Bundle bundle = new Bundle();
bundle.putString("name", "张三");
fragment1.setArguments(bundle); FragmentManager fm = getFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.addToBackStack(null);
transaction.add(R.id.content,fragment1);
transaction.hide(HomeFragment.this);
transaction.commit();

这里需要注意的是,一定要现有Fragment在去使用Bundle传递参数。

接受参数就相对比较简单了,一半的时候会考虑在Fragment的onAttach生命周期里面去接受。

代码如下:

  

Bundle arguments = getArguments();
String name = arguments.getString("name");

是不是很简单了,当然我们最好还需要判断下获取的值是不是为空,因为有可能在没有网络的时候没有从服务器获取到数据,这里就会接受不到。

再来介绍第二种参数的传递方式:

  我们在商城客户端里面市场会碰到这样的需求,我们选择了购买的时候还需要指定我们的送货地址,选择发票之类的业务。这样我们就需要把另外的Fragment里面选择的结果传递到前面的Fragment里面去做相关处理。

  通常这样的情景在Activity里面一半会通过参数回传的方式

    

@Override
public void startActivityForResult(Intent intent, int requestCode) {
// TODO Auto-generated method stub
super.startActivityForResult(intent, requestCode);
}

但是在Fragment里面不推荐这么使用,在Fragment里面一般使用比较灵活的回调接口去传递参数。

  所以我们首先需要去定义一个接口,接口的代码如下:

public interface OnResultListener {
void OnResult(String value);
}

这里的命名方式还是比较正规的,模仿的是android里面点击事件来做的。

  然后我们可以做这样的一些类操作:

      1、一个Fragment里面点击前往另外的一个Fragmengt

      2、另外的一个Fragment里面有个按钮点击会通过接口回调的方式把参数回调个第一个Fragmennt

在第二个Fragment里面我们需要定义一个方法,传递的参数就是我们前面定义的一个接口,通过this给这个接口赋值。

  

private OnResultListener listener;

    public void setListemer(OnResultListener listener) {
this.listener = listener;
}

然后我们可以在何时的时机去给这个接口里面的接口方法的参数传递值。

  

    @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.f1_but:
if (listener != null) {
listener.OnResult("test");
} else {
Toast.makeText(getActivity(), "listener is null",
Toast.LENGTH_SHORT).show();
}
// 弹出栈
getFragmentManager().popBackStack();
break; default:
break;
}
}

这里需要的弹出栈,当我们点击确定按钮的时候就会把当前的Fragment弹出栈,去第一个Fragment里面。

由于我们最先的需求是从第一个Fragment前往第二个Fragment。所以我们还需要在第一个Fragment里面去做切换。

            FragmentManager fm = getFragmentManager();
FragmentTransaction transaction = fm.beginTransaction();
transaction.addToBackStack(null);
transaction.add(R.id.content,fragment1);
transaction.hide(HomeFragment.this);
transaction.commit();

这里有几点需要注意的:

1、不要使用replace期做替换,使用add方法,replace会先干掉Fragment里面的view 到时候回调回来的参数不能显示。

2、add使用,要Hide,这样避免页面的层叠状况。

3、注意添加到栈,这样我们就可以操作返回键了,因为Fragment是挂载到Acticity上面的,不将Fragment添加到栈,点击返回键是直接对当前的Activity做操作

    如果当前只有一个Activity是会直接退出当前APP的

本来向附上源码的,但是无奈找不到在哪上传附件,忧伤啊!

Fragment的数据传递的更多相关文章

  1. Android开发——fragment中数据传递与刷新UI(更改控件)

    数据传递: 1.通过数据库进行数据的传递 如在fragment中将数据保存在数据库中,之后其他的fragment或者activity直接读取数据库中的数据,数据库使用还算简单,这里就不多说,建议使用l ...

  2. android Fragment的数据传递

    Bundle传递参数 Fragment1 fragment1 = new Fragment1();Bundle bundle = new Bundle();bundle.putString(" ...

  3. Android - fragment之间数据传递

    <Fragment跳转时传递参数及结果回传的方法> <Fragment详解之五——Fragment间参数传递> <Android解惑 - 为什么要用Fragment.se ...

  4. 核心基础以及Fragment与Activity传递数据完整示例

    MainActivity如下: package cc.testsimplefragment0; import android.os.Bundle; import android.app.Activit ...

  5. fragment 数据传递,传值,通信

    [原][Fragment精深系列4]Fragment与Activity之间的数据交互 2015-5-26阅读389 评论0   以下内容来自于自己的实践和网络资料的整理,希望对你有帮助. 一.Acti ...

  6. Activity与Fragment数据传递之Fragment从Activity获取数据

    整理Fragment与Activity之间的数据交换,大体上包括三种: 1.Fragment从Activity获取数据 2.Activity从Fragment获取数据 3.Fragment之间获取数据 ...

  7. Fragment与Activity传递数据

    MainActivity如下: package cc.testsimplefragment0; import android.os.Bundle; import android.app.Activit ...

  8. fragment间的数据传递

    今天我将要讲的是fragment间的数据是如何进行传递的.这里我将举个简单的例子. 首先要有个MainActivity,它托管了MainFragment,而MainFragment又托管了DatePi ...

  9. activity与fragment之间的传递数据

    首先activity之间的数据传递就是 用intent和intent+bundle intent 传递 Intent i= new Intent(MainActivity.this,TheAty.cl ...

随机推荐

  1. HDU-3436 Queue-jumpers 树状数组 | Splay tree删除,移动

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3436 树状数组做法<猛戳> Splay tree的经典题目,有删除和移动操作.首先要离散化 ...

  2. struct stat 作用

    stat,lstat,fstat1 函数都是获取文件(普通文件,目录,管道,socket,字符,块()的属性.函数原型#include <sys/stat.h> int stat(cons ...

  3. linux磁盘简单分区方式

    1:分区 fdisk /dev/sdb 2:格式化 mkfs -t ext3  /dev/sdb1 或者 mke2fs -t ext4  /dev/sdb2 3:挂载 mount /dev/sdb1 ...

  4. Oracle 中 union与union all

    如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字. union(或称为联合)的作用是将多个结果合并在一起显示出来. union和uni ...

  5. 已知有一个Worker 类如下:  public class Worker  { private int age;  private String name;  private double salary;  public Worker (){}  public Worker (String nam

    package homework006; public class Worker { private int age; private String name; private double sala ...

  6. SAP PP 生产订单变更记录保存

    *&---------------------------------------------------------------------* *& 包括 ZXCO1U01 *&am ...

  7. SCO连接AD / SCOM

    SCO安装完成后,下载IP包,打开Deployment Manager注册IP包,并将其部属到Runbook Server SCO IP包下载地址:http://technet.microsoft.c ...

  8. POJ 2778 DNA Sequence (AC自己主动机 + dp)

    DNA Sequence 题意:DNA的序列由ACTG四个字母组成,如今给定m个不可行的序列.问随机构成的长度为n的序列中.有多少种序列是可行的(仅仅要包括一个不可行序列便不可行).个数非常大.对10 ...

  9. hdu 5495 LCS 水题

    LCS Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5495 Descr ...

  10. Java开发手冊 Java学习手冊教程(MtJava开发手冊)

    本文档的版权归MtJava文档小组全部,本文档及其描写叙述的内容受有关法律的版权保护,对本文档内容的不论什么形式的非法复制.泄露或散布.将导致对应的法律责任. MtJava仅仅是一个学习Java的简化 ...