Activity与Activity之间,Fragment与Fragment之间通过Bundle传值的研究
来源:互联网 发布:java的循环语句 编辑:程序博客网 时间:2024/05/21 08:52
传值场景
通常来说在页面之间传递数据有两种情况,Activity传递Activity、Fragment传递给Fragment。这两种情况都使用到了Bundle,只是使用的方式有一些差别。
传值方法
Activity To Activity:
Activity之间的调用需要通过Intent来实现,那么要传递的数据也需要封装到Bundle中,通过Intent传递到接收Activity中。例如如下代码:
SaveProject nTestObject = new SaveProject();Bundle nBundle = new Bundle();nBundle.putParcelable("PROJECT", nTestObject);nBundle.putString("NAME", nTestObject.toString());Intent nIteIntent = new Intent(FirstActivity.this, SecondActivity.class);nIteIntent.putExtras(nBundle);FirstActivity.this.startActivity(nIteIntent);
Fragment To Fragment:
Fragment之间的调用就如同普通的类一样,直接调用构造方法来实例化Fragment对象即可。建议的传值方式是通过Bundle来传递,而不是直接作为构造参数传递。首先,官方建议在每个Fragment类中实现如下的构造方法:
public static SecondFragment getInstance(Bundle bundle) {SecondFragment secondFragment = new SecondFragment();secondFragment.setArguments(bundle);return secondFragment;}
那么在需要调用某个Fragment时,执行类似如下代码:
SaveProject nTestObject = new SaveProject();Bundle nBundle = new Bundle();nBundle.putParcelable("PROJECT", nTestObject);nBundle.putString("NAME", nTestObject.toString());SecondFragment secondFragment = SecondFragment.getInstance(nBundle);android.app.FragmentTransaction transaction = getFragmentManager().beginTransaction();transaction.replace(R.id.fragment_id, secondFragment);transaction.commit();
差异现象
为了测试两种传输方式传递对象的方式是否相同,我分别通过Bundle传递了一个对象new SaveProject(),在接收到对象之后打印出传递前后对象的内存信息。参考以下打印内容不难发现,通过Intent传递的Bundle中包含的对象属于拷贝,即Activity_A中的对象通过Bundle传递给Activity_B,后者接收的对象与之前发送的对象不是同一个。而Fragment之间通过构造参数传递的Bundle中的对象传递的应该属于引用。
Activity:
12-10 16:32:47.953: D/bundle_test(14691): Activity_send = com.panda.bundledatatest.SaveProject@40fb3668
12-10 16:32:47.953: D/bundle_test(14691): ---------------------------
12-10 16:32:47.953: D/bundle_test(14691): Activity_get = com.panda.bundledatatest.SaveProject@40fbf180
12-10 16:33:20.935: D/bundle_test(14691): Fragment_send = com.panda.bundledatatest.SaveProject@40fd5e20
12-10 16:33:20.935: D/bundle_test(14691): ---------------------------
12-10 16:33:20.935: D/bundle_test(14691): Fragment_get = com.panda.bundledatatest.SaveProject@40fd5e20
差异分析
1、intent传递对象时,传递的是一个副本(深拷贝)。所以在android中,intent进行数据传递时,基本数据类型和对象传递的都是副本,改变传递过来的值,不会改变原来的值。
2、如果单纯的构造参数传值,Bundle的对象是相同的内存地址,也就是说接受者拿到的只是发送者的一个引用而已。- Activity与Activity之间,Fragment与Fragment之间通过Bundle传值的研究
- Activity与Activity之间,Fragment与Fragment之间通过Bundle传值的研究
- Activity与Fragment之间的传值
- Activity与Fragment之间的传值
- Activity与Fragment之间的传值
- Activity与Activity,Activity与Fragment及Fragment与Fragment之间传值
- Fragment与Activity之间传值
- Fragment与Activity之间传值
- Activity与Fragment,以及Fragment与Fragment之间的数据通讯
- Activity与Fragment,Fragment与Fragment之间的通信
- activity之间,fragment之间,activity与fragment之间跳转
- Fragment与Activity之间传值,Fragment与Fragment传值以及对commit的理解
- android开发fragment、Activity与Activity之间的值传递
- Android之---Activity与Fragment之间的传值问题
- Activity与fragment之间交互
- activity与fragment之间的数据交互
- Fragment,Activity与 FragmentActivity之间的关系
- Fragment与Activity之间的互访
- 《C++沉思录》-第八章- 一个面向对象程序范例
- 加载nib中自定义UIView
- Oracle数据库的一些操作
- IOCP模型开发
- 单链表的非空判断及长度的输出
- Activity与Activity之间,Fragment与Fragment之间通过Bundle传值的研究
- 【C++基础之十八】类继承中的隐藏规则
- 伪静态是什么?PHP为什么要使用伪静态?
- 浅谈Oracle数据库12c PDB技术
- 轻松学HTML+CSS网站开发
- Yii的Model ( 模型)创建及使用
- 使用超级表格快速创建在线表单(如问卷调查、报名表)
- linux磁盘分区fdisk命令详解
- 黑马程序员: String练习题