2011年12月26日 星期一

Android - Pass Data (2) --使用 Parcelable 方式

依官網說法使用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);     
    }   
}

執行結果如下:

一開始執行時




















進入到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() 寫入資料順序來讀出的,因此要特別注意資料型態不要放錯了!


沒有留言:

張貼留言