依官網說法使用Parcel的方式:http://developer.android.com/reference/android/os/Parcel.html
由Activity傳遞物件到另一個Activity的方式, 必需先將要傳遞的物件implements Parcelable 後,即可利用Intent.putExtra()的方式送到另一個Activity。實做方式利用3個java檔:
SourceObject.java : 要傳遞的物件,需implements Parcelable
Main.java : 將物件丟到Main2
Main2.java : 接收來自Main1的物件
SourceObject.java如下:
public class SourceObject implements Parcelable {
private String mTempString1;
private int mInt;
private String mTempString2;
//以下紅色部份是因為implements Parcelable情況下,一定要有的function
public SourceObject(Parcel in) {
Log.d("TestParcel","SourceObject(Parcel in)");
readFromParcel(in);
}
public int describeContents() {
Log.d("TestParcel","describeContents()");
return 0;
}
public void writeToParcel(Parcel dest, int flags) {
Log.d("TestParcel","writeToParcel()");
//先把資料寫進去dest這個Parcel裡面
dest.writeString(mTempString1);
dest.writeString(mTempString2);
dest.writeInt(mInt);
}
private void readFromParcel(Parcel in) {
Log.d("TestParcel","readFromParcel()");
//要用的時候,就按當初寫入的順序讀出in這個Parcel裡面的資料
mTempString1 = in.readString();
mTempString2 = in.readString();
mInt = in.readInt();
}
public static final Parcelable.Creator<SourceObject> CREATOR = new Parcelable.Creator<SourceObject>() {
public SourceObject createFromParcel(Parcel in) {
Log.d("TestParcel","createFromParcel()");
return new SourceObject(in);
}
public SourceObject[] newArray(int size) {
Log.d("TestParcel","newArray()");
return new SourceObject[size];
}
};
//以下是通常在沒有implements Parcelable情況下,自己寫的function
public SourceObject() {
Log.d("TestParcel","SourceObject()");
}
public void setTempString1(String TempString) {
Log.d("TestParcel","setTempString1()");
mTempString1 = TempString;
}
public String getTempString1() {
Log.d("TestParcel","getTempString1()");
return mTempString1;
}
public void setTempString2(String TempString) {
Log.d("TestParcel","setTempString2()");
mTempString2 = TempString;
}
public String getTempString2() {
Log.d("TestParcel","getTempString2()");
return mTempString2;
}
}
Main.java如下:
public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
Log.d("TestParcel","Main/onCreate()");
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn = (Button) findViewById(R.id.Button01);
OnClickListener lis = new OnClickListener() {
public void onClick(View v) {
Log.d("TestParcel","Main/onClick()");
SourceObject obj = new SourceObject();
obj.setTempString1("This is String1");
obj.setTempString2("This is String2");
Intent it = new Intent();
it.setClass(Main.this, Main2.class);
it.putExtra("TestSource",obj);
startActivity(it);
}
};
btn.setOnClickListener(lis);
}
}
Main2.java如下:
public class Main2 extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
Log.d("TestParcel","Main2/onCreate()");
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);
SourceObject obj = this.getIntent().getParcelableExtra("TestSource");
TextView txt2 = (TextView) findViewById(R.id.txt2);
String showString1 = obj.getTempString1();
String showString2 = obj.getTempString2();
obj.setTempString1("This is modified by Main2");
String showString3 = obj.getTempString1();
txt2.setText(showString1 + "\n" + showString2 + "\n" + showString3);
}
}
執行結果如下:
附上按下Button的Log檔,以了解程式流程:
D/TestParcel( 895): Main/onCreate()
D/TestParcel( 895): Main/onClick()
D/TestParcel( 895): SourceObject()
D/TestParcel( 895): setTempString1()
D/TestParcel( 895): setTempString2()
D/TestParcel( 895): writeToParcel()
D/TestParcel( 895): Main2/onCreate()
D/TestParcel( 895): createFromParcel()
D/TestParcel( 895): SourceObject(Parcel in)
D/TestParcel( 895): readFromParcel()
D/TestParcel( 895): getTempString1()
D/TestParcel( 895): getTempString2()
D/TestParcel( 895): setTempString1()
D/TestParcel( 895): getTempString1()
請注意在readFromParcel()是按照當初 writeToParcel() 寫入資料順序來讀出的,因此要特別注意資料型態不要放錯了!
由Activity傳遞物件到另一個Activity的方式, 必需先將要傳遞的物件implements Parcelable 後,即可利用Intent.putExtra()的方式送到另一個Activity。實做方式利用3個java檔:
SourceObject.java : 要傳遞的物件,需implements Parcelable
Main.java : 將物件丟到Main2
Main2.java : 接收來自Main1的物件
SourceObject.java如下:
public class SourceObject implements Parcelable {
private String mTempString1;
private int mInt;
private String mTempString2;
//以下紅色部份是因為implements Parcelable情況下,一定要有的function
public SourceObject(Parcel in) {
Log.d("TestParcel","SourceObject(Parcel in)");
readFromParcel(in);
}
public int describeContents() {
Log.d("TestParcel","describeContents()");
return 0;
}
public void writeToParcel(Parcel dest, int flags) {
Log.d("TestParcel","writeToParcel()");
//先把資料寫進去dest這個Parcel裡面
dest.writeString(mTempString1);
dest.writeString(mTempString2);
dest.writeInt(mInt);
}
private void readFromParcel(Parcel in) {
Log.d("TestParcel","readFromParcel()");
//要用的時候,就按當初寫入的順序讀出in這個Parcel裡面的資料
mTempString1 = in.readString();
mTempString2 = in.readString();
mInt = in.readInt();
}
public static final Parcelable.Creator<SourceObject> CREATOR = new Parcelable.Creator<SourceObject>() {
public SourceObject createFromParcel(Parcel in) {
Log.d("TestParcel","createFromParcel()");
return new SourceObject(in);
}
public SourceObject[] newArray(int size) {
Log.d("TestParcel","newArray()");
return new SourceObject[size];
}
};
//以下是通常在沒有implements Parcelable情況下,自己寫的function
public SourceObject() {
Log.d("TestParcel","SourceObject()");
}
public void setTempString1(String TempString) {
Log.d("TestParcel","setTempString1()");
mTempString1 = TempString;
}
public String getTempString1() {
Log.d("TestParcel","getTempString1()");
return mTempString1;
}
public void setTempString2(String TempString) {
Log.d("TestParcel","setTempString2()");
mTempString2 = TempString;
}
public String getTempString2() {
Log.d("TestParcel","getTempString2()");
return mTempString2;
}
}
Main.java如下:
public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
Log.d("TestParcel","Main/onCreate()");
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn = (Button) findViewById(R.id.Button01);
OnClickListener lis = new OnClickListener() {
public void onClick(View v) {
Log.d("TestParcel","Main/onClick()");
SourceObject obj = new SourceObject();
obj.setTempString1("This is String1");
obj.setTempString2("This is String2");
Intent it = new Intent();
it.setClass(Main.this, Main2.class);
it.putExtra("TestSource",obj);
startActivity(it);
}
};
btn.setOnClickListener(lis);
}
}
Main2.java如下:
public class Main2 extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
Log.d("TestParcel","Main2/onCreate()");
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);
SourceObject obj = this.getIntent().getParcelableExtra("TestSource");
TextView txt2 = (TextView) findViewById(R.id.txt2);
String showString1 = obj.getTempString1();
String showString2 = obj.getTempString2();
obj.setTempString1("This is modified by Main2");
String showString3 = obj.getTempString1();
txt2.setText(showString1 + "\n" + showString2 + "\n" + showString3);
}
}
執行結果如下:
一開始執行時 |
進入到Main2時 |
附上按下Button的Log檔,以了解程式流程:
D/TestParcel( 895): Main/onCreate()
D/TestParcel( 895): Main/onClick()
D/TestParcel( 895): SourceObject()
D/TestParcel( 895): setTempString1()
D/TestParcel( 895): setTempString2()
D/TestParcel( 895): writeToParcel()
D/TestParcel( 895): Main2/onCreate()
D/TestParcel( 895): createFromParcel()
D/TestParcel( 895): SourceObject(Parcel in)
D/TestParcel( 895): readFromParcel()
D/TestParcel( 895): getTempString1()
D/TestParcel( 895): getTempString2()
D/TestParcel( 895): setTempString1()
D/TestParcel( 895): getTempString1()
請注意在readFromParcel()是按照當初 writeToParcel() 寫入資料順序來讀出的,因此要特別注意資料型態不要放錯了!
沒有留言:
張貼留言