现在的位置: 首页 > 综合 > 正文

Activity间传类对象数据

2012年09月30日 ⁄ 综合 ⁄ 共 5275字 ⁄ 字号 评论关闭

        Activity间要传递数据,很多时候简单的int和string满足不了需求,我们在面向对象中已经习惯了类和对象,

那么下面就说一下如何传递类对象。

        Android中有两种办法来完成这件事。一个是Java的序列化(Serializable),另一个是Android的Parcelable序列化方法。

对于第一种办法实现很简单,只需要实现Serializable接口就好了。就像下面是一个person类:

package com.linc.meta;

import java.io.Serializable;

@SuppressWarnings("serial")
public class Person2 implements Serializable {
	private String Name = null;
	private String Gender = null;
	private int HP = 0;
	private String Summary = null;
	private String Skill = null;
	
	public Person2(String name,String gender,int HP,String summary,String skill)
	{
		this.Name = name;
		this.Gender = gender;
		this.Summary = summary;
		this.HP = HP;
		this.Skill = skill;
	}
	
	public String getName() {
		return Name;
	}

	public void setName(String name) {
		Name = name;
	}

	public String getGender() {
		return Gender;
	}

	public void setGender(String gender) {
		Gender = gender;
	}

	public int getHP() {
		return HP;
	}

	public void setHP(int hP) {
		HP = hP;
	}

	public String getSummary() {
		return Summary;
	}

	public void setSummary(String summary) {
		Summary = summary;
	}

	
	
	public String getSkill() {
		return Skill;
	}

	public void setSkill(String skill) {
		Skill = skill;
	}
}

怎么样,很简单的把原来的person类实现Serializable接口就可以了。

对于第二种办法,实现起来还是稍微有点小磕绊。

这是Android新提供的序列化类,首先要看看Parcel类 ,它是一个数据的容器,只要你的类实现Parcelable接口,并完成几个步骤就可以放到Parcel中传递了。

有三个步骤要完成:

一、完成writeToParcel(Parcel dest, int flags)方法:该方法将类的数据写入外部提供的Parcel中

二、完成describeContents():这是返回描述性的东西,返回值是整型,通常是0.如果知道marshalled,请看CONTENTS_FILE_DESCRIPTOR

三、Parcelable.Creator 接口

        请看下面,还是person类,它实现了Parcelable接口。

package com.linc.meta;

import android.os.Parcel;
import android.os.Parcelable;

public class Person implements Parcelable {
	private String Name = null;
	private String Gender = null;
	private int HP = 0;
	private String Summary = null;
	private String Skill = null;
	
	public Person(String name,String gender,int HP,String summary,String skill)
	{
		this.Name = name;
		this.Gender = gender;
		this.Summary = summary;
		this.HP = HP;
		this.Skill = skill;
	}
	
	public String getName() {
		return Name;
	}

	public void setName(String name) {
		Name = name;
	}

	public String getGender() {
		return Gender;
	}

	public void setGender(String gender) {
		Gender = gender;
	}

	public int getHP() {
		return HP;
	}

	public void setHP(int hP) {
		HP = hP;
	}

	public String getSummary() {
		return Summary;
	}

	public void setSummary(String summary) {
		Summary = summary;
	}

	
	
	public String getSkill() {
		return Skill;
	}

	public void setSkill(String skill) {
		Skill = skill;
	}
	//Describe the kinds of special objects contained in this Parcelable's marshalled representation.
	//CONTENTS_FILE_DESCRIPTOR
	@Override
	public int describeContents() {
		// TODO Auto-generated method stub
		return 0;
	}
	
	//该方法将类的数据写入外部提供的Parcel中
	@Override
	public void writeToParcel(Parcel dest, int flags) {
		dest.writeString(Name);
		dest.writeString(Gender);
		dest.writeString(Summary);
		dest.writeInt(HP);
		dest.writeString(Skill);
	}
	
	public static final Parcelable.Creator<Person> CREATOR = new Creator<Person>()
	{

		@Override
		public Person createFromParcel(Parcel source) {
			return new Person(source);
		}

		@Override
		public Person[] newArray(int size) {
			return new Person[size];
		}
		
	};
	
	private Person(Parcel dest)
	{
		this.Name = dest.readString();
		this.Gender = dest.readString();
		this.Summary = dest.readString();
		this.HP = dest.readInt();
		this.Skill = dest.readString();
	}
		
}

最后举一个例子,有两个Activity A和B,A中点击button后用Serializable传给B person,然后在B中点击button,把person用parcelable再传回来。

activity A

package com.linc;

import com.linc.meta.Person;
import com.linc.meta.Person2;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class ActivityA extends Activity {
	private TextView txt ;
	private Button btn;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        txt = (TextView)findViewById(R.id.txt);
        btn = (Button)findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				transferData();
			}
		});
        
        Intent intent = getIntent();
        
    	Person person = (Person) intent.getParcelableExtra("person");
    	if(person != null)
	    	txt.setText("person :\n " + person.getName() + " \n "
	    			+ person.getGender() + " \n "
	    			+ person.getSummary() + " \n "
	    			+ person.getHP() + " \n "
	    			+ person.getSkill());
    }
    
    private void transferData()
    {
    	Person2 person = new Person2("张飞", "男", 4, "五虎上将之一。燕山人士,喜欢喝酒,生性豪放重情义。", "咆哮");
    	Intent intent = new Intent();
    	intent.setClass(this, ActivityB.class);
    	intent.putExtra("person2", person);
    	startActivity(intent);
    }
}

ActivityB

package com.linc;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.linc.meta.Person;
import com.linc.meta.Person2;

public class ActivityB extends Activity {
	private TextView txt ;
	private Button btn;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        txt = (TextView)findViewById(R.id.txt);
        btn = (Button)findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				transferData();
			}
		});
        
        Intent intent = getIntent();
        if(intent != null)
    	{
        	Person2 person = (Person2) intent.getSerializableExtra("person2");
        	txt.setText("person : \n" + person.getName() + " \n "
        			+ person.getGender() + " \n "
        			+ person.getSummary() + " \n "
        			+ person.getHP() + " \n "
        			+ person.getSkill());
    	}
    }
    
    private void transferData()
    {
    	Person person = new Person("黄盖", "男", 4, "东吴老将,配合周瑜使用苦肉计,骗过了将干,舍身无畏。", "苦肉");
    	Intent intent = new Intent();
    	intent.setClass(this, ActivityA.class);
    	intent.putExtra("person", person);
    	startActivity(intent);
    }
}

也可以用parcelable来传递多个类对象。

就是把多个person放到list中,然后取时用intent.getParcelableArrayListExtra("person_list")取出。就okay了。

源码在这里。

抱歉!评论已关闭.