1. 程式人生 > >android中傳遞複雜引數,activity之間和fragment之間的bundle傳遞集合/物件

android中傳遞複雜引數,activity之間和fragment之間的bundle傳遞集合/物件

       在Android開發中,Activity之間通過Intent使用bundle,fragment之間和Activityty通過setArguments使用bundle,對於一些簡單的引數傳遞比較簡單,而且方式也有多種,這個就不介紹了。在這裡介紹一下複雜的引數傳遞,比如傳遞集合ArrayList,物件ArrayList<Object>。

       無論是Activity之間引數傳遞,還是Fragment之間引數傳遞,或者是Activity與Fragment之間,都要使用Bundle,方式基本相同。Bundle在這裡就相當與一個介質,把資料捆綁在一起;

但是對於一些物件的傳遞,我們則需要把被傳遞的物件需要先實現序列化,而序列化物件有兩種方式:

java.io.Serializable和android.os.Parcelable

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

轉載請出示出處;