android中傳遞複雜引數,activity之間和fragment之間的bundle傳遞集合/物件
在Android開發中,Activity之間通過Intent使用bundle,fragment之間和Activityty通過setArguments使用bundle,對於一些簡單的引數傳遞比較簡單,而且方式也有多種,這個就不介紹了。在這裡介紹一下複雜的引數傳遞,比如傳遞集合ArrayList,物件ArrayList<Object>。
無論是Activity之間引數傳遞,還是Fragment之間引數傳遞,或者是Activity與Fragment之間,都要使用Bundle,方式基本相同。Bundle在這裡就相當與一個介質,把資料捆綁在一起;
但是對於一些物件的傳遞,我們則需要把被傳遞的物件需要先實現序列化,而序列化物件有兩種方式:
Java中使用的是Serializable,而谷歌在Android使用了自定義的Parcelable。
兩種序列化方式的區別:
1.在使用記憶體的時候,Parcelable比Serializable效能高,推薦使用Parcelable類;
2.Serializable在序列化的時候會產生大量的臨時變數,從而引起頻繁的GC;
3.Parcelable不能使用在要將資料儲存在磁碟上的情況,因為Parcelable不能很好的保證資料的持續性在外界有變化的情況下,這種情況建議使用Serializable。
Activity跳轉到另一個Activity,
第一步 ;定義序列化實體類
Serializable方式:
第二步;傳遞序列化物件物件public class StudentSer implements Serializable { private String name; private int age; private String habby; private String title; public StudentSer() { super(); } public StudentSer(String name, int age, String habby, String title) { super(); this.name = name; this.age = age; this.habby = habby; this.title = title; } 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 getHabby() { return habby; } public void setHabby(String habby) { this.habby = habby; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + ", habby=" + habby + ", title=" + title + "]"; } }
// 點選跳轉第二個Acitivity
Intent intent = new Intent(MainActivity.this,
SecondActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("data", data);
intent.putExtras(bundle);
startActivity(intent);
第三步;接收序列化物件
// 獲取bundle傳遞過來的資料
Intent intent = getIntent();
data = (ArrayList<StudentSer>) intent.getSerializableExtra("data");
Activity傳遞引數到fragment
Parcelable方式
第一步 ;定義序列化實體類
public class StudentPar implements Parcelable {
private String name;
private int age;
private String habby;
private String title;
public StudentPar() {
super();
}
public StudentPar(String name, int age, String habby, String title) {
super();
this.name = name;
this.age = age;
this.habby = habby;
this.title = title;
}
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 getHabby() {
return habby;
}
public void setHabby(String habby) {
this.habby = habby;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", habby=" + habby
+ ", title=" + title + "]";
}
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
public static final Parcelable.Creator<StudentPar> CREATOR = new Creator<StudentPar>() {
@Override
public StudentPar createFromParcel(Parcel source) {
// TODO Auto-generated method stub
StudentPar stu = new StudentPar();
stu.name = source.readString();
stu.age = source.readInt();
stu.habby = source.readString();
stu.title = source.readString();
return stu;
}
@Override
public StudentPar[] newArray(int size) {
// TODO Auto-generated method stub
return new StudentPar[size];
}
};
/** 講實體類資料寫入Parcel */
@Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
dest.writeString(name);
dest.writeInt(age);
dest.writeString(habby);
dest.writeString(title);
}
}
第二步,傳遞序列化物件
Fragment fragment = new MyFragment();
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("fragData", fragData);// ("fragData",fragData);
fragment.setArguments(bundle);
ft.replace(R.id.fram, fragment, "myFragment");
ft.commit();
第三步;接收引數
Bundle bundle = getArguments();
ArrayList<StudentPar> fragData = bundle.getParcelableArrayList("fragData");
總結,傳遞物件可以通過Serializable和Parcelable,無論是Activity之間還是fragment之間或者Activity和fragment之間的引數傳遞,都大同小異,切記被傳遞的物件要實現Serializable和Parcelable;Serializable相對比較簡單很多。使用哪一種方式視情況而定。好了,歡迎大家交流指正。附下Demo,如下:
點選開啟連結http://download.csdn.net/detail/kern_/8738587
轉載請出示出處;