본문 바로가기

Android/Parcelable example

Android Parcelable example

Android에서 Activity 간의 데이터 전달에서 기본형이 아닌 객체를  전달하는 예

Android에서 기본형이 아닌 일반 객체를 다른 Activity에 전달하기 위해서는 Parcel객체로 변환할 필요가 있고 다시 Parcel객체를 원래의 클래스 형으로 복원할 필요도 있는데, 이와 같은 일들을 Parcelable 인터페이스가 지원해주므로 전달하려는 객체의 클래스를 선언할 때는 Parcelable 인터페이스를 구현해야 한다. 아래의 예제에서 Member 클래스는 Parcelable 인터페이스 구현하고 있다.

AndroidManifest.xml


<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.androidapp" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".TestActivity" android:label="@string/title_activity_main" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".Activity02"/> </application> </manifest>


parcelable.xml


<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="I D : " /> <EditText android:id="@+id/editText1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:ems="10" > <requestFocus /> </EditText> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="PWD : " /> <EditText android:id="@+id/editText2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:ems="10" android:inputType="textPassword" /> </LinearLayout> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onBtnLogin" android:text="로그인" /> </LinearLayout>


TestActivity.java


package com.example.androidapp; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.*; public class TestActivity extends Activity { EditText editId, editPwd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.parcelable); editId = (EditText) findViewById(R.id.editText1); editPwd = (EditText) findViewById(R.id.editText2); } public void onBtnLogin(View v) { int id = Integer.valueOf(editId.getText().toString()); String pwd = editPwd.getText().toString(); Member m = new Member(id, pwd); Intent intent = new Intent(this, Activity02.class); intent.putExtra("member", m); startActivity(intent); } }


Member.java


package com.example.androidapp; import android.os.Parcel; import android.os.Parcelable; /* 안드로이드에서는 액티비티간에 데이터를 전달할 때 기본형이나 String형이 * 아니면 전달할 수 없지만 대상 객체가 Parcel객체로 변환할 수 있다면 가능하다 * Parcelable인터페이스는 구현된 클래스의 객체를 Parcel객체로 변환하거나 * Parcel객체로부터 원래의 클래스 형으로 변환하는 기능을 지원한다 * writeToParcel() : Parcel 객체로 변환한다 * createFromParcel() : Parcel객체로부터 원래의 클래스형으로 복원한다 */ public class Member implements Parcelable { private int id; private String pwd; public static final Parcelable.Creator<Member> CREATOR = new Parcelable.Creator<Member>() { public Member createFromParcel(Parcel parcel) { return new Member(parcel); } public Member[] newArray(int size) { return new Member[size]; } }; public Member(int id, String pwd) { this.id = id; this.pwd = pwd; } public Member(Parcel parcel) { this.id = parcel.readInt(); this.pwd = parcel.readString(); } public int describeContents() { return 0; } public void writeToParcel(Parcel parcel, int flags) { parcel.writeInt(id); parcel.writeString(pwd); } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } }


Activity02.java


package com.example.androidapp; import android.app.Activity; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.EditText; public class Activity02 extends Activity { EditText editId, editPwd; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.parcelable); editId = (EditText) findViewById(R.id.editText1); editPwd = (EditText) findViewById(R.id.editText2); editId.setBackgroundColor(Color.CYAN); editPwd.setBackgroundColor(Color.CYAN);

Intent intent = getIntent(); Member m = (Member)intent.getExtras().getParcelable("member"); editId.setText(m.getId()+""); editPwd.setText(m.getPwd()); } }