[Android学习]Activity之间传递对象和对象集合
2014-04-15 14:41 hellenism 阅读(5042) 评论(0) 编辑 收藏 举报开发过程中,Activity之间传递数据是必不可少的,android中使用Intent和Bundle作为数据载体,在Activity之间传递,对于基础数据类型,Bundle已经提供相关的put,get方法,而作为自定义的类型则需要有特别的要求.
自定义类型,想要使用Bundle传递时,需要满足特定条件。即该类型需要实现Serializable接口或者Parcelable接口
(注意:如果目标对象中包含其他对象,则被包含的对象也需要实现Serializable接口或者Parcelable接口)
(关于Serializable接口和Parcelable接口就不在此做记录了)
步骤:
1.定义类,实现相关接口
2.使用Intent和Bundle对应的方法set数据
3.startActivity传递Intent对象
使用Serializable
一.传递对象
a).定义类,实现Serializable接口
public class Student implements Serializable { // members private String name; private String age; private int id; // getter setter public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } /** * Serializable */ private static final long serialVersionUID = 1L; }
b).使用Intent传递对象
// 使用Serializable Button btnSerializable = (Button)findViewById(R.id.btnSerializable); btnSerializable.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub // create data Student student = new Student(); student.setName("stephen lee"); student.setAge("12"); student.setId(1); // bundle Bundle bundle = new Bundle(); bundle.putSerializable(MainActivity.StudentKey,student); // intent Intent intent = new Intent(arg0.getContext(),SecondActivity.class); intent.putExtras(bundle); // navigate startActivity(intent); } });
c).获取传递的数据
Bundle bundle = this.getIntent().getExtras(); Student student = (Student)bundle.getSerializable(MainActivity.StudentKey); if(student!=null) textView.setText("name:" + student.getName() + "age:" + student.getAge() + "id:" + student.getId());
二.传递对象集合
a).同上
b).同上(注意使用putSerializable()方法时,需要把List<>强转成为Serializable,并且集合中的成员都需要实现Serializable接口)
Button btnSerializableList = (Button)findViewById(R.id.btnSerializableList); btnSerializableList.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub // create data List<Student> students = new ArrayList<Student>(); Student student1 = new Student(); student1.setName("hellenism"); student1.setAge("12"); student1.setId(1); Student student2 = new Student(); student2.setName("stephen lee"); student2.setAge("12"); student2.setId(2); students.add(student1); students.add(student2); // bundle , 注意:使用putSerializable()方法时,需要把List<>强转成为Serializable,并且集合中的成员都需要实现Serializable接口 Bundle bundle = new Bundle(); bundle.putSerializable(MainActivity.StudentsKey,(Serializable)students); // intent Intent intent = new Intent(v.getContext(),SecondActivity.class); intent.putExtras(bundle); // navigate startActivity(intent); } });
c).同上(不足之处在于,由于获取数据时候,需要把Serializable强转成为对应的List<>,此处会有警告)
Bundle bundle = this.getIntent().getExtras(); List<Student> students = (List<Student>)bundle.getSerializable(MainActivity.StudentsKey); if(students!=null) textView.setText("name:" + students.get(1).getName() + "age:" + students.get(1).getAge() + "id:" + students.get(1).getId());
使用Parcelable
一.传递对象
a).定义类,实现Parcelable接口
public class Person implements Parcelable { // members private String name; private String age; private int id; // getter setter public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } // Parcelable @Override public int describeContents() { // TODO Auto-generated method stub return 0; } @Override public void writeToParcel(Parcel dest, int flags) { // TODO Auto-generated method stub dest.writeString(name); dest.writeString(age); dest.writeInt(id); } public static final Parcelable.Creator<Person> CREATOR = new Creator<Person>() { public Person createFromParcel(Parcel source) { Person person = new Person(); person.age = source.readString(); person.name = source.readString(); person.id = source.readInt(); return person; } public Person[] newArray(int size) { return new Person[size]; } }; }
b).使用Intent传递参数
// 使用Parcelable Button btnParcelable = (Button)findViewById(R.id.btnParcelable); btnParcelable.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub // create data Person person = new Person(); person.setName("i am person"); person.setAge("12"); person.setId(1); // bundle Bundle bundle = new Bundle(); bundle.putParcelable(MainActivity.PersonKey,person); // intent Intent intent = new Intent(arg0.getContext(),SecondActivity.class); intent.putExtras(bundle); // navigate startActivity(intent); } });
c).获取传递的参数
Bundle bundle = this.getIntent().getExtras(); Person person = (Person)bundle.getParcelable(MainActivity.PersonKey); if(person!=null) textView.setText("name:" + person.getName() + "age:" + person.getAge() + "id:" + person.getId());
二.传递数据类型
a).同上
b).同上
Button btnParcelableList = (Button)findViewById(R.id.btnParcelableList); btnParcelableList.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub // create data List<Person> persons = new ArrayList<Person>(); Person person1 = new Person(); person1.setAge("12"); person1.setName("stephen lee"); person1.setId(1); Person person2 = new Person(); person2.setAge("12"); person2.setName("hellenism"); person2.setId(2); persons.add(person1); persons.add(person2); // bundle Bundle bundle = new Bundle(); bundle.putParcelableArrayList(MainActivity.PersonsKey, (ArrayList<? extends Parcelable>) persons); // intent Intent intent = new Intent(v.getContext(),SecondActivity.class); intent.putExtras(bundle); // navigate startActivity(intent); } });
c).同上
Bundle bundle = this.getIntent().getExtras(); List<Person> persons = bundle.getParcelableArrayList(MainActivity.PersonsKey); if(persons!=null) textView.setText("name:" + persons.get(1).getName() + "age:" + persons.get(1).getAge() + "id:" + persons.get(1).getId());
注意:
使用以上方法传递对象时,都是创建了新的实例,而非传递对象的引用,如果是传递引用,也就无需序列化了。
完整例子: