在开发过程中,为了方便我们经常需要将一个activity中的值在跳转到下一个activity时进行传值,我们经常遇到的就是对一些基本的数据类型的传递,那么如果是一个对象,或者一个对象集合需要传递时我们应该如何操作呢?本篇博客将解决以上问题,
通过本篇博客你将学到以下知识点:
①使用Intent传递常用的数据类型(int,String,float,double)的方法
②使用Intent传递String集合的方法
③使用Intent传递单个对象的方法(分为:传递实现了 Parcelable的单个对象和实现了 Serializable的单个对象)
④使用Intent传递对象的集合(分为:传递实现了 Parcelable的对象集合和实现了 Serializable的对象集合)
⑤activity之间传递Map
好了我们进入正题首先来对以上情况一一说明
在说Intent传值之前我们首先来看一张Intent所传的值的所有类型的一张图
1.使用Intent传递基本的数据类型
使用Intent传递基本数据类型应该是在开发中最常见的一种形式,从上图中可以看出,android中可以使用Intent传递的基本数据类型有:boolean,byte,char,double,float,short,String以及与之对应的他们的数组,其实除了这些呢还有我们经常遇到的对象。下面我们就上一个实例来对其传递过程进行说明
由于项目比较简单我就先说下项目的大概内容,后面会附上源码。在此项目中有两个Activity一个为MainActivity另一个为ShowActivity,在MainActivity中有一个按钮点击按钮后进行activity的跳转,然后在ShowActivity中把MainActivity中传过来的值显示出来
btnShow.setOnClickListener( new OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setClass(MainActivity. this,ShowActivity. class);
/**
* 传递常用的数据类型
*/
intent.putExtra( "year", 2015); //int 数据类型
intent.putExtra( "isValue", true); //boolean 数据类型
intent.putExtra( "data", "this is a test data"); //String类型
intent.putExtra( "IntArray", new int[]{1,2}); //int 类型的数组
intent.putExtra( "StringArray", new String[]{"shanghai","ganzhou" ,"wuhan" }); //String类型的数组
intent.putExtra( "BooleanArray", new boolean[]{true ,false,true,false}); // boolean类型的数组
startActivity(intent);
}
});
在ShowActivity中接收并打印传来的信息代码如下:
//接收基本数据类型
intData=getIntent().getIntExtra( "year", 0);
boolData=getIntent().getBooleanExtra( "isValue", false);
strData=getIntent().getStringExtra( "data");
intArray=getIntent().getIntArrayExtra( "IntArray");
strArray=getIntent().getStringArrayExtra( "StringArray");
boolArray=getIntent().getBooleanArrayExtra( "BooleanArray");
//拼写textView显示的数据
sb.append( "Int:"+ intData+ "\n");
sb.append( "Boolean:"+ boolData+ "\n");
sb.append( "String:"+ strData+ "\n");
sb.append( "IntArray:"+ intArray[0]+ ","+ intArray[1]+ "\n");
sb.append("StringArray:"+strArray [0]+"," +strArray [1]+"," +strArray [2]+"\n" );
sb.append("BooleanArray:" +boolArray [0]+"," +boolArray [1]+"\n" );
运行之后打印的信息如下:
基本数据类型其他的类型和上面的写法一致我就不在写了。
2.使用Intent传递String集合的方法
/**
* String集合
*/
ArrayList<String> arraylist= new ArrayList<String>();
arraylist.add( "list1");
arraylist.add( "list2");
intent.putStringArrayListExtra( "arraylist", arraylist);
在ShowActivity中接收String集合的代码如下:
arraylist=getIntent().getStringArrayListExtra("arraylist" );
sb.append("ArrayList:"+arraylist .get(0)+"," +arraylist .get(1)+"\n" );
打印信息如下:
3.使用Intent传递单个对象的方法
使用Intent传递对象时有两种方法:①此对象实现了
Serializable接口 ②此对象实现了Parcelable接口
如果您对Serializable和Parcelable不是特别了解请看此博客http://blog.youkuaiyun.com/dmk877/article/details/48447783
(1)首先来介绍实现了Serializable接口的单个对象我们来创建一个Student类并实现Serializable接口
Student类
package com.example.progressbar;
import java.io.Serializable;
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
private String sex;
public Student(){}
public Student(String name, int age,String sex){
this. name=name;
this. age=age;
this. sex=sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this. name = name;
}
public int getAge() {
return age;
}
public void setAge( int age) {
this. age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this. sex = sex;
}
}
那么我们如何来传递Student的对象呢?有下面两种方案
一种是通过Intent传值的方式,传递方法如下:
/**
* 传递对象 方式一
*/
intent.putExtra( "intent_student", new Student("intent传递单个对象" ,20 ,"male" ));
startActivity(intent);
接收方法如下:
intentStudent =(Student) getIntent().getSerializableExtra("intent_student" );
第二种方法也是建议使用的方法是通过Bundle的方式
/**
* 传递对象 方式二
*/
Bundle bundle=new Bundle();
bundle.putSerializable( "bundle_student", new Student("bundle传递单个对象" ,18,"female" ));
intent.putExtras(bundle);
startActivity(intent);
接收方法如下:
bundleStudent =(Student) getIntent().getSerializableExtra("bundle_student" );
在此要注意的是:I
ntent是没有
putSerializable()此方法的。
(2)介绍完传递实现了Serializable接口的单个对象后我们接着来介绍实现了Parcelable接口的单个对象
我们再来创建一个实现了Parcelable接口的类
Book类
package com.example.progressbar;
import android.os.Parcel;
import android.os.Parcelable;
public class Book implements Parcelable{
private String name;
private int price;
private String author;
public Book(){}
public Book(String name, int price,String author){
this.name=name;
this.price=price;
this.author=author;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice( int price) {
this.price = price;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
@Override
public int describeContents() {
return 0;
}
// 该方法将类的数据写入外部提供的Parcel中。
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString( this. name);
parcel.writeInt( this. price);
parcel.writeString( this. author);
}
// 返回一个Book[i]供外部类反序列化本类数组使用
public static final Parcelable.Creator<Book> CREATOR= new Creator<Book>() {
@Override
public Book[] newArray( int i) {
return new Book[i];
}
// 将Parcel对象反序列化为Book对象
@Override
public Book createFromParcel(Parcel parcel) {
// TODO Auto-generated method stub
return new Book(parcel.readString(), parcel.readInt(), parcel.readString());
}
};
}
与实现了
Serializable接口的对象类似我们也是用两种方法来传递其对象
第一种传递方式
/**
* 传递实现了 Parcelable接口的对象方式一
*/
Book book1;
book1= new Book( "Intent传递",210,"杜老师" );
intent.putExtra( "book1",book1);//将对象 写入到一个Parcel对象中
startActivity(intent);
接收对象的方式
Book book1;
book1=getIntent().getParcelableExtra( "book1");//将Parcel中刚才写入的对象还原
第二种方法也是建议使用的方法是通过Bundle的方式
/**
* 传递 Serializable接口的方式二
*/
Book book2;
Bundle bundle= new Bundle();
book2= new Book( "Bundle传递",210,"杜老师" );
bundle.putParcelable( "book2",book2);//将对象 写入到一个Parcel对象中
intent.putExtras( bundle);
startActivity(intent);
接收对象的方式
Book book2;
book2=getIntent().getParcelableExtra( "book2");//将Parcel中刚才写入的对象还原
4.使用Intent传递对象的集合
使用Intent传递对象集合时也有两种方法:①对象实现了Serializable接口 ②对象实现了Parcelable接口
和上面一样我们也分两种情况
(1)传递实现了Serializable接口的对象的集合
传递对象集合的方式如下:
/**
* 传递实现了 Serializable接口的对象的集合方式
*/
ArrayList<Student> stuList= new ArrayList<Student>();
Student student;
for( int i=1;i<6;i++){
student= new Student( "intent传值"+i,10,"male" );
stuList.add(student);
}
//以下两种方式都可以
intent.putExtra( "stuList",stuList);
//建议使用如下这种
intent.putExtra( "stuList1", (Serializable)stuList);
startActivity(intent);
接收对象集合的方式
List<Student> stuList;
stuList= (List<Student>) getIntent().getSerializableExtra("stuList" );
ArrayList<Student> stuList1 = (ArrayList<Student>) getIntent().getSerializableExtra("stuList1");
(2)传递实现了Parcelable接口的对象的集合
传递实现了
Parcelable接口的对象的集合有如下的两种方式
①
/**
* 传递实现了 Parcelable的对象的集合方式一
*/
ArrayList<Book> bookList= new ArrayList<Book>();
Book book;
for ( int i = 1; i < 5; i++) {
book= new Book( "BookName"+i, 100+i, "BookAuthor"+i);
bookList.add(book);
}
intent.putParcelableArrayListExtra("bookList" ,bookList);
与之对应的接收对象集合的方法:
ArrayList<Book> bookList=getIntent().getParcelableArrayListExtra("bookList" );
②
/**
* 传递实现了 Parcelable的对象的集合方式二
*/
Bundle bundle= new Bundle();
bundle.putParcelableArrayList( "bookList1", bookList);
intent.putExtras( bundle);
startActivity(intent);
5.activity之间传递Map
activity之间传递Map我们需要封装一个类
SeralizableMap类
package com.example.progressbar;
import java.io.Serializable;
import java.util.Map;
public class SeralizableMap implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private Map<String,Student> map;
public Map<String,Student> getMap()
{
return map;
}
public void setMap(Map<String,Student> map)
{
this.map=map;
}
}
有了此类之后我们可以直接调用
setMap()方法其实它的原理就是传递一个实现了
Serializable接口的对象在需要传值时我们只需要
/**
* 传递Map对象
*/
HashMap<String,Student> arrMap= new HashMap<String,Student>();
ArrayList<Student> stuListForMap= new ArrayList<Student>();
Student student1;
for( int i=0;i<3;i++){
student1= new Student( "传递的Map",10,"male" );
stuListForMap.add(student1);
arrMap.put( ""+i,student1);
}
SeralizableMap tmpmap= new SeralizableMap();
tmpmap.setMap(arrMap);
bundle.putSerializable( "MAP", tmpmap);
我们如何取出Map?实际上就是取出一个实现了
Serializable接口的对象可以采用如下的方式
HashMap<String,Student> arrMap;
SeralizableMap tmpmap = (SeralizableMap) getIntent().getExtras().getSerializable("MAP" );
然后就可以操作此Map了如想获得Map中key="0"的Student对象的Name可以使用String name=
map.get("0").getName();来获取好了这一篇就到这里了,看完如果对你有用就顶一个呗。如有疑问和谬误请留言我会在第一时间进行回答和改正。。。
