Activity之间传递参数(三)
------siwuxie095
传递值对象,即自定义的有数据类型的对象
1、首先
new 一个 class:User,用于创建自定义对象,同时右键 Generate
出
Constructor、setter 和 getter 方法(很简单,也可以手敲):
package com.siwuxie095.sendargs; /** * Created by siwux on 2017/1/2. */ public class User { private String name; private public String getName() { return name; } public this.name = name; } public return age; } public this.age = age; } public User(String name, int age) { this.name = name; this.age = age; } } |
2、在MainActivity.java中,如果直接加上
i.putExtra("user",new User("Bill",18)); |
就会报如下错误,即User的数据类型要么是 Parcelable(Android
平台用于序列化对象的接口),要么是
Serializable(Java语言内置
的用于序列化对象的接口):
3、二者的区别,分别实现一下即可知,先来实现
Serializable(与Parcelable
相比效率较低),在
User.java 中只做如下实现即可(所有序列化操作,系统
自动完成):
public class User implements Serializable |
4、MainActivity.java 和 TheAty.java,代码一览:
package com.siwuxie095.sendargs; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; public class MainActivity extends AppCompatActivity { @Override protected super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.btnStartAty).setOnClickListener(new View.OnClickListener() { @Override public //创建一个new Intent()实例,传入Context和Class类型的参数 //对应MainActivity.this 和 Intent i = new Intent(MainActivity.this,TheAty.class); // //通过Intent对象,调用putExtra()方法,传参 // //这里传入String和String类型的参数,实际上就是键值对 // i.putExtra("data","你好 // //传递数据包要用到Bundle,通过Bundle存入多种类型数据,传给第二个Activity // Bundle b=new Bundle(); // //b.putBundle(); 即Bundle也可以嵌入Bundle // b.putString("name","Jack"); // b.putInt("age",22); // //putExtras() 传入Bundle //// i.putExtras(b); // //除了通过putExtras()传,还能用下面的putExra() // i.putExtra("data",b); i.putExtra("user",new User("Bill",18)); //传入i startActivity(i); } }); } } |
package com.siwuxie095.sendargs; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; public class TheAty extends AppCompatActivity { private TextView tv; @Override protected super.onCreate(savedInstanceState); setContentView(R.layout.activity_the_aty); //TheAty是通过MainActivity中的Intent启动,直接通过getIntent()方法 //获取与这个Activity相关的Intent Intent i=getIntent(); // //在第二个Activity 即TheAty 获取Bundle //// Bundle data=i.getExtras(); // Bundle data=i.getBundleExtra("data"); //要访问TextView,先在上面声明 //findViewById()的返回值在编译时只能查看到类型是View,而事实上是TextView类型 //需要强制类型转换 tv= (TextView) findViewById(R.id.tv); // //调用setText()方法设置字符串,这里字符串通过Intent获取 // tv.setText(i.getStringExtra("data")); //需要做一个强制类型转换 User user= (User) i.getSerializableExtra("user"); //直接通过setText()方法传入字符串即可 tv.setText(String.format("User Info(name = %s, age = %d)",user.getName(),user.getAge())); // //用到了String.format() // // 假如有一个不存在的数据 // // 那么getString()有一个重载函数 // tv.setText(String.format("name = %s, age = %d, namex = %s",data.getString("name"),data.getInt("age"),data.getString("namex","Mary"))); } } |
5、运行一览:
6、再来实现
Parcelable,需要是实现两个方法,直接点击即可:
7、User.java,修改后:
package com.siwuxie095.sendargs; import android.os.Parcel; import android.os.Parcelable; import java.io.Serializable; /** * Created by siwux on 2017/1/2. */ //public class User implements Serializable{ public class User implements Parcelable{ private String name; private public String getName() { return name; } public this.name = name; } public return age; } public this.age = age; } public User(String name, int age) { this.name = name; this.age = age; } //第一个方法不用管 @Override public return } //向目标dest的Parcel里写数据 //将数据保存起来 @Override public dest.writeString(getName()); dest.writeInt(getAge()); } //还需创建一个Creator,泛型是User public static final Creator<User> CREATOR = new Creator<User>() { //createFromParcel() 通过一个Parcel来创建对象 @Override public User createFromParcel(Parcel source) { //直接返回一个new User() // User中如果数据过多,也可以打包成Bundle // 直接writeBundle() readBundle()即可 return new User(source.readString(),source.readInt()); } @Override public User[] newArray(int size) { return new User[size]; } }; //注意这里还要加分号 } |
8、MainActivity.java 不变,TheAty.java只需接收时改为:
User user=i.getParcelableExtra("user"); |
TheAty.java:
package com.siwuxie095.sendargs; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; public class TheAty extends AppCompatActivity { private TextView tv; @Override protected super.onCreate(savedInstanceState); setContentView(R.layout.activity_the_aty); //TheAty是通过MainActivity中的Intent启动,直接通过getIntent()方法 //获取与这个Activity相关的Intent Intent i=getIntent(); // //在第二个Activity 即TheAty 获取Bundle //// Bundle data=i.getExtras(); // Bundle data=i.getBundleExtra("data"); //要访问TextView,先在上面声明 //findViewById()的返回值在编译时只能查看到类型是View,而事实上是TextView类型 //需要强制类型转换 tv= (TextView) findViewById(R.id.tv); // //调用setText()方法设置字符串,这里字符串通过Intent获取 // tv.setText(i.getStringExtra("data")); // 需要做一个强制类型转换 // User user= (User) i.getSerializableExtra("user"); //不需要强制类型转换 User user=i.getParcelableExtra("user"); //直接通过setText()方法传入字符串即可 tv.setText(String.format("User Info(name = %s, age = %d)",user.getName(),user.getAge())); // //用到了String.format() // // 假如有一个不存在的数据 // // 那么getString()有一个重载函数 // tv.setText(String.format("name = %s, age = %d, namex = %s",data.getString("name"),data.getInt("age"),data.getString("namex","Mary"))); } } |
9、总结:Serializable 操作简单,序列化由系统自动完成,所以速度慢,
Parcelable 操作复杂,需要手写,但Android平台支持更好,速度快
【made by siwuxie095】
Activity之间传递参数(三)的更多相关文章
- 在Activity之间传递参数(三)——serializable和parcelable的区别
传递值对象: 一.serializable实现:简单易用 serializable的迷人之处在于你只需要对某个类以及它的属性实现Serializable 接口即可.Serializable 接口是一种 ...
- Android学习总结——Activity之间传递参数
核心内容:一.在 Activity 之间传递简单数据二.在 Activity 之间传递复杂数据 三.在 Activity 之间传递自定义值对象 软件环境:Android Studio 一.在 ...
- Activity之间传递参数(四)
--------siwuxie095 获取Activity的返回参数 1.首先修改两个布局文件,都修改为 LinearLayout 布局, 添加orientation属性为:vertical. (1) ...
- 在Activity之间传递参数(四)
获取Activity的返回参数(在参数(三)User的例子的基础上实现): 1.activity_the_aty.xml文件:<EditText android:id="@+id/ed ...
- Activity之间传递参数(二)
------siwuxie095 传递数据包 1.传递数据包要用到Bundle,MainActivity.java中: package com.siwuxie095.sendargs; import ...
- Activity之间传递参数(一)
-------siwuxie095 传递简单数据 (1)首先创建一个项目:SendArgs (2)选择API:21 Android 5.0 (3)选择 Empty Activity (4)默认 (5) ...
- 在Activity之间传递参数(一)
准备: 一.创建主界面:activity_main.xml文件中<Button android:text="启动另一个Activity" android:id="@ ...
- 在Activity之间传递参数(二)
传递数据包bundle: 1.MainActivity.class: findViewById(R.id.btnStartAty).setOnClickListener(new View.OnClic ...
- Activity之间传递大数据问题
Android开发人员都知道,Intent适用于在不同的Activity之间传递数据,包括参数.字符串.以及序列化的对象等.但是笔者所做的项目用到了使用Intent 传递Bitmap图片对象,图片的数 ...
随机推荐
- php redis 安装篇(windows 7)
人人都说redis比memcached好,但是没有实际体验过,概念还是比较模糊,今天就先把redis安装好,后面的体验再分享,由于php已经有了很好的扩展库支持,所以redis安装非常方便,下面是wi ...
- iPad 控件UIPopoverController使用
UIPopoverController 是iPad特有控件,(iOS7-9),在iOS9之后别废弃 使用步骤 设置内容控制器 UIPopoverController直接继承NSObject,不具备可视 ...
- 在网页中嵌入地图API
1.登录百度地图api,地址:http://api.map.baidu.com/lbsapi/creatmap/index.html 2.设置你的地理位置 3.简单设置下地图功能.地图的宽度和高度根据 ...
- WIn2003的IIS6解决IE11登录问题。
一键批处理文件下载:http://download.csdn.net/detail/hospp/6850835 1.打开文件夹C:\Windows\Microsoft.NET\Framework\v4 ...
- java 使用递归获取指定文件路径目录,删除指定的文件后缀(可扩展,根据具体需要的删除的后缀进行配置)~~
在工作开发过程中,每次用SVN提交代码全选择的时候,发现会产生很多不需要的文件后缀垃圾文件,感觉挺烦人的,一个一个删太麻烦了,如果产生多种后缀文件时,那删起来多费劲,是吧?想想,就写了一段程序通过递归 ...
- JQuery lhgdialog使用
jQuery方式调用 J ); testDG4.SetPosition( 'center', 'center' );}; var testDG4 = J('#btn26').dialog({ id:' ...
- SQL Server 自定义聚合函数
说明:本文依据网络转载整理而成,因为时间关系,其中原理暂时并未深入研究,只是整理备份留个记录而已. 目标:在SQL Server中自定义聚合函数,在Group BY语句中 ,不是单纯的SUM和MAX等 ...
- 23. Can't connect to X11 window server using '127.0.0.1:0.0' as the value of the DISPLAY variable.解决办法
在终端里 以root用户执行 #xhost + 然后su - oracle 执行#export DISPLAY=:0 运行runinstaller
- PS Web切图界面设置
界面为移动工具时(快捷键V),选中左上角的图层. 点击视图,选中显示→智能参考线,与标尺. 点击窗口,把"库" "颜色"去掉,把屏幕右上角的"通道&q ...
- 用EXCEL内嵌的Visual Basic for Application 编程,通过 UGSimple USB-GPIB 控制器来驱动仪器34401A,并从34401A读取数据
现在市场上有很多中USB-GPIB 控制器,或叫 USB 转GPIB链接线. 每种GPIB控制器都有它的 函数库(dll库).各种GPIB 控制器的价钱插别很大.这里以一种价钱较便宜的USB-GPIB ...