Android-Parcelable

本文介绍了在Android开发中如何使用Parcelable接口进行数据序列化。作者从遇到parcelable概念开始,逐步讲解如何新建工程文件,实现Parcelable接口,处理Creator方法,以及在实践中添加变量并进行数据操作。最后提醒开发者注意导入相关包和在清单文件中注册Activity。
摘要由CSDN通过智能技术生成

【一】我在看一个项目的代码时候发现一个我从未认识的知识点:parcelable。出现在一个对象类 实现了这个parcelable接口类。我搜索了一些资料来学习这个知识点。以下是我的学习笔记

【二】新建一个工程文件(比如ParcelableDemo)

1、生成的Activity文件先别管吧。

2、另新建一个名叫MyParcelable的java文件,实现Parcelable接口。会出现2个重写方法,样式代码如下

public int describeContents() {
		return 0;
	}

public void writeToParcel(Parcel dest, int flags) {
		
	}


 
3、我查了parcelable 文档的介绍,大体是可以将一些数据打包,然后传输。再需要的时候分解出来。也就是说,我们可以写一个对象实例放到parcelable中。开始完善重写方法。代码进展如下 
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的创建方法则不需要)


好了,大家运行一下试试.效果图如下


点击按钮之后,接环切换到如下



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值