How to pass user defined Object from one activity to other
In the previous blog we saw how to pass the primitive data from one activity to other. In this blog we’ll see how we can pass user defined data from one activity to other. Let us say we have a user defined class Employee having two attributes id and name. In order to enable us to pass object of Employee from 1 activity to other the Employee class needs to implement the interface called Parcelable. This interface is for classes whose instances can be written to and restored from a Parcel. Classes implementing the Parcelable interface must also have a static field called CREATOR, which is an object implementing the Parcelable.Creator interface.
Employee.java
package com.passdata; import android.os.Parcel; import android.os.Parcelable; public class Employee implements Parcelable { int id; String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Employee(int id, String name) { super(); this.id = id; this.name = name; } @Override public int describeContents() { // TODO Auto-generated method stub return 1; } @Override public void writeToParcel(Parcel dest, int flags) { // TODO Auto-generated method stub dest.writeInt(id); dest.writeString(name); } public Employee(Parcel source) { // TODO Auto-generated method stub id = source.readInt(); name = source.readString(); } public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { @Override public Employee createFromParcel(Parcel source) { // TODO Auto-generated method stub return new Employee(source); } @Override public Employee[] newArray(int size) { // TODO Auto-generated method stub return new Employee[size]; } }; }
When a class implements Parcelable interface it needs to override 2 methods – describeContents method and writeToParcel method. writeToParcel method is overriden to flatten this object in to a Parcel. In our overriden method of Employee class we are just writing the id and name attribute of Employee object into Parcelable object. Also, classes implementing the Parcelable interface must also have a static field called CREATOR, which is an object implementing the Parcelable.Creator interface. So in our Employee class we are making a static field CREATOR. We need to override 2 methods here:
1. createFromParcel(Parcel source)
Create a new instance of the Parcelable class, instantiating it from the given Parcel whose data had previously been written by Parcelable.writeToParcel().
2.newArray(int size)
Create a new array of the Parcelable class.
As our overriden version of createFromParcel returns a new Employee object by calling constructor of Employee with Parcelable object as argument we need to create a constructor in Employee class for the same.
public Employee(Parcel source) {
// TODO Auto-generated method stub
id = source.readInt();
name = source.readString();
}
Once the above is done, we can create the Activity class as follows:
ActivityOne.java
package com.passdata; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class ActivityOne extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button button = (Button) findViewById(R.id.btn); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(ActivityOne.this,ActivityTwo.class); Bundle b = new Bundle(); Employee e = new Employee(1, "shawn"); b.putParcelable("parse", e); intent.putExtras(b); startActivity(intent); } }); } }
ActivityTwo.java
package com.passdata; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.widget.TextView; public class ActivityTwo extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity2); TextView textView = (TextView) findViewById(R.id.txt); Intent intent = getIntent(); Bundle b = intent.getExtras(); Employee e = b.getParcelable("parse"); textView.setText(e.getId() + ":" + e.getName()); } }
The layout xml files are as follows:
main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Pass Data" android:id="@+id/btn" /> </LinearLayout>
activity2.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/txt" /> </LinearLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.passdata" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".ActivityOne" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="ActivityTwo"></activity> </application> </manifest>
Do let me know your feedback.