Fragment的数据传递
开发之中用到的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的数据传递的更多相关文章
- Android开发——fragment中数据传递与刷新UI(更改控件)
数据传递: 1.通过数据库进行数据的传递 如在fragment中将数据保存在数据库中,之后其他的fragment或者activity直接读取数据库中的数据,数据库使用还算简单,这里就不多说,建议使用l ...
- android Fragment的数据传递
Bundle传递参数 Fragment1 fragment1 = new Fragment1();Bundle bundle = new Bundle();bundle.putString(" ...
- Android - fragment之间数据传递
<Fragment跳转时传递参数及结果回传的方法> <Fragment详解之五——Fragment间参数传递> <Android解惑 - 为什么要用Fragment.se ...
- 核心基础以及Fragment与Activity传递数据完整示例
MainActivity如下: package cc.testsimplefragment0; import android.os.Bundle; import android.app.Activit ...
- fragment 数据传递,传值,通信
[原][Fragment精深系列4]Fragment与Activity之间的数据交互 2015-5-26阅读389 评论0 以下内容来自于自己的实践和网络资料的整理,希望对你有帮助. 一.Acti ...
- Activity与Fragment数据传递之Fragment从Activity获取数据
整理Fragment与Activity之间的数据交换,大体上包括三种: 1.Fragment从Activity获取数据 2.Activity从Fragment获取数据 3.Fragment之间获取数据 ...
- Fragment与Activity传递数据
MainActivity如下: package cc.testsimplefragment0; import android.os.Bundle; import android.app.Activit ...
- fragment间的数据传递
今天我将要讲的是fragment间的数据是如何进行传递的.这里我将举个简单的例子. 首先要有个MainActivity,它托管了MainFragment,而MainFragment又托管了DatePi ...
- activity与fragment之间的传递数据
首先activity之间的数据传递就是 用intent和intent+bundle intent 传递 Intent i= new Intent(MainActivity.this,TheAty.cl ...
随机推荐
- ZOJ-3380 Patchouli’s Spell Cards DP, 组合计数
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3380 题意:有m种不同的元素,每种元素都有n种不同的相位,现在假 ...
- 50个Java多线程面试题
不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java 语言一个重要的特点就是内置了对并发的支持,让 Java 大受企业和程序员的欢迎.大多数待遇丰厚的 Java 开发职位都要求开发者 ...
- 与IO相关的等待事件troubleshooting-系列9
Buffer Cache与IO相关的等待事件: 这种等待事件的产生原因是包含DBWR进程和IO Slaves的Buffer Cache操作. 'db file parallel write' , 'd ...
- URL- 含义及组成
URL (uniform resource locator) : 互联网的每个网页都有自己唯一的统一资源定位器,由3部分组成:通信协议,主机名,资源名. HTTP(hypertext transfer ...
- c++中类长度解析
通常我们定义一个类,它所占的空间有多大呢? 首先我们看一下下面的这个类 class A{ public: void func1(void){ printf("11111heihei\n&qu ...
- spring aop 的一个demo(未完,待完善)
假设我们有这样的一个场景 : 对于一个类的众多方法,有些方法需要从缓存读取数据,有些则需要直接从数据库读取数据.怎样实现呢? 实现方案有多种.下面我说下常见的几种实现方案 : 1.直接采用spring ...
- centos6下安装部署hadoop2.2
环境准备1.操作系统:centos6.0 64位2.hadoop版本:hahadoop-2.2.0 安装和配置步骤具体如下:1.主机和ip分配如下 ip地址 ...
- Cocos2d-x 3.0心得(01)-图片载入与混合模式
近期開始用cocos2dx 3.0做东西,略有心(cao)得(dian),略微作下记录吧. v3.0相对v2.2来说,最引人注意的,应该是对触摸层级的优化.和lambda回调函数的引入(嗯嗯.不枉我改 ...
- 理解shared_ptr<T> ---2
1.引用计数字段不能放在资源管理类中.我们的解决办法是,把引用计数和资源绑在一起,进行二次封装.但是这样存在一个大问题,不同类型的资源管理类不能兼容.也就是说,shared_ptr<Dog> ...
- Spring技术内幕:Spring AOP的实现原理(二)
**二.AOP的设计与实现 1.JVM的动态代理特性** 在Spring AOP实现中, 使用的核心技术时动态代理.而这样的动态代理实际上是JDK的一个特性.通过JDK的动态代理特性,能够为随意Jav ...