【一】我在看一个项目的代码时候发现一个我从未认识的知识点:parcelable。出现在一个对象类 实现了这个parcelable接口类。我搜索了一些资料来学习这个知识点。以下是我的学习笔记
【二】新建一个工程文件(比如ParcelableDemo)
1、生成的Activity文件先别管吧。
2、另新建一个名叫MyParcelable的java文件,实现Parcelable接口。会出现2个重写方法,样式代码如下
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel dest, int flags) {
}
public class MyParcelable implements Parcelable {
private int mData;//实例的对象
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mData);
}
}
4、这一步还不是很理解,不过可以先理解为这里需要一个静态的CREATOR。
语句为public static final Parcelable.Creator<T> CREATOR = new Parcelable.Creator<T>() {};这时候Eclipse会报红线提示错误。处理一下,会得到需要的两个带泛型T的方法。代码进展如下
public class MyParcelable implements Parcelable {
private int mData;
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mData);
}
public static final Parcelable.Creator<T> CREATOR = new Parcelable.Creator<T>() {
@Override
public T createFromParcel(Parcel source) {
// TODO Auto-generated method stub
return null;
}
@Override
public T[] newArray(int size) {
// TODO Auto-generated method stub
return null;
}
};
}
5、把T换成当前的class类名。
createFromParcel(Parcel source)方法,返回了一个实例。里面的数据是通过之前的重写方法writeToParcel(Parcel dest, int flags)传递过来的,获取并实例化。
MyParcelable[] newArray(int size)方法, 返回了一个数组。这个数组里面的每一个数据都被初始化为null。
6、构造函数(暂时不知道怎么解释具体作用)。到目前,代码的进度如下
public class MyParcelable implements Parcelable {
private int mData;
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mData);
}
public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() {
@Override
public MyParcelable createFromParcel(Parcel source) {
return new MyParcelable(source);
}
@Override
public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};
/**
* 构造函数
* @param source
* @Description:
*
*/
private MyParcelable(Parcel p){
mData = p.readInt();
}
}
整个用法思路大致如上。
【三】接下来是实践操作环节。
1、把mData删掉,添加一个String类型的变量name, int类型的变量id;添加get set方法。
2、按照之前的方法把name 和id放到parcelable中。代码进度如下
public class MyParcelable implements Parcelable {
private String name = null;
private int id = 0;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
/*****************************************************************************/
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(id);
}
public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() {
@Override
public MyParcelable createFromParcel(Parcel source) {
MyParcelable myParcelable = new MyParcelable();
myParcelable.name = source.readString();//拿到String类型的数据 name
myParcelable.id = source.readInt();//拿到int类型的数据 id
return myParcelable;//返回这个实例
}
@Override
public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};
}
【四】设置Mainactivity.java代码。
public class MainActivity extends Activity {
//控件对象
private EditText nameEditText;
private EditText idEditText;
private Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//布局文件xml
//实例化控件
nameEditText = (EditText)findViewById(R.id.name_content);
idEditText = (EditText)findViewById(R.id.id_content);
mButton = (Button)findViewById(R.id.start);
mButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String name = nameEditText.getEditableText().toString();
int id = Integer.parseInt(idEditText.getEditableText().toString());
Log.d("Name is: ", name);
Log.d("ID is: ", id + "");
MyParcelable myParcelable = new MyParcelable();
myParcelable.setName(name);
myParcelable.setId(id);
Intent intent = new Intent();
intent.setClass(MainActivity.this, MainActivity2.class);
intent.putExtra("data", myParcelable);
startActivity(intent);
}
});
}
}
【五】设置MainActivity2.java代码
public class MainActivity2 extends Activity {
private EditText nameEditText;
private EditText idEditText;
private Button mButton;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
nameEditText = (EditText)findViewById(R.id.name_content);
idEditText = (EditText)findViewById(R.id.id_content);
mButton = (Button)findViewById(R.id.start);
mButton.setVisibility(View.INVISIBLE);
Intent intent = getIntent();
MyParcelable myParcelable = (MyParcelable)intent.getParcelableExtra("data");
String name = myParcelable.getName();
int id = myParcelable.getId();
nameEditText.setText(name);
idEditText.setText(id + "");
}
}
【六】activity_main.xml文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<LinearLayout
android:id="@+id/first_row"
android:layout_width="fill_parent"
android:layout_height="50dip"
android:orientation="horizontal"
>
<TextView
android:id="@+id/name_label"
android:layout_width="60dip"
android:layout_height="fill_parent"
android:gravity="center"
android:text="Name"
/>
<EditText
android:id="@+id/name_content"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_vertical|left"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/second_row"
android:layout_width="fill_parent"
android:layout_height="50dip"
android:orientation="horizontal"
>
<TextView
android:id="@+id/id_label"
android:layout_width="60dip"
android:layout_height="fill_parent"
android:gravity="center"
android:text="ID"
/>
<EditText
android:id="@+id/id_content"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_vertical|left"
/>
</LinearLayout>
<Button
android:id="@+id/start"
android:layout_width="fill_parent"
android:layout_height="50dip"
android:gravity="center"
android:text="Go"
>
</Button>
</LinearLayout>
【七】大家千万别偷懒啊,记得给代码导包;还有MainActivity2.java记得在功能清单中注册一下(如果直接生成activity的创建方法则不需要)
好了,大家运行一下试试.效果图如下
点击按钮之后,接环切换到如下