activity之间使用Intent传值

在两个activity之间使用Intent对象进行传值,可以使用Intent对象的putExtra方法,该方法有许多的重载方法对于基本数据类型以及数组的传值,都能满足,这不是本文的重点,现在我们来探讨一下使用Parcelable和Serializable方式传递对象

Serializable方式:

Serializable方式实际上是将对象进行序列化后进行传递,所以在我们传递对象时候,一定要记得实现 Serializable接口生成 serialVersionUID,这样才能在使用Intent.putExtra()方法,例子如下:
前提条件:使用TestActivity1和TestActivity2两个activity进行传值,其中TestActivity1是值的设置方,TestActivity2是值的接收方,传递的对象是TestUser1
TestUser1对象如下:
public class TestUser1 implements Serializable{
	
	private static final long serialVersionUID = -6845458138306849582L;
	private String username;
	private String psw;
	
	public TestUser1() {
		super();
	}
	public TestUser1(String username, String psw) {
		super();
		this.username = username;
		this.psw = psw;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPsw() {
		return psw;
	}
	public void setPsw(String psw) {
		this.psw = psw;
	}
	public static long getSerialversionuid() {
		return serialVersionUID;
	}
	
}

TestActivity1代码如下:
@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.test1);
		test1_btn = (Button)findViewById(R.id.test1_btn);
		test1_btn.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent intent = new Intent(TestActivity1.this,TestActivity2.class);
				/*
				 * 方式一:Serializable
				 */
				TestUser1 user = new TestUser1();
				user.setPsw("123456");
				user.setUsername("testname");
				intent.putExtra("user", user);
				startActivity(intent);
			}
		});
	}
布局文件test1如下:
<?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="horizontal" >

    <Button
        android:id="@+id/test1_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="跳转到test2" />

    <EditText
        android:id="@+id/test1_text"
        android:layout_width="150dp"
        android:layout_height="wrap_content"
        android:hint="hint text" />


</LinearLayout>
界面如下:




点击“跳转到test2”按钮能够将对象传递到TestActivity2中
TestActivity代码如下:
public class TestActivity2 extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.test2);
		Intent intent = getIntent();
		EditText test2_text = (EditText)findViewById(R.id.test2_text);
		/*
		 * Serializable方式
		 */
		TestUser1 user = (TestUser1)intent.getSerializableExtra("user");
		test2_text.setText(user.getUsername());
	}
	
}

效果如下:
我们看到testname已经完整的传值到了TestActivity2里面

Parcelable方式:

前提条件:使用TestActivity1和TestActivity2两个activity进行传值,其中TestActivity1是值的设置方,TestActivity2是值的接收方,传递的对象是TestUser2
TestUser2对象如下:
public class TestUser2 implements Parcelable {
	private String username;
	private String psw;
	private int age;
	public TestUser2() {
		super();
	}
	public TestUser2(String username, String psw,int age) {
		super();
		this.username = username;
		this.psw = psw;
		this.age = age;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public TestUser2(Parcel p) {
		username = p.readString();
//		psw = p.readString();
		age = p.readInt();
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPsw() {
		return psw;
	}
	public void setPsw(String psw) {
		this.psw = psw;
	}
	
	public static final Parcelable.Creator<TestUser2> CREATOR = new Parcelable.Creator<TestUser2>() {  
        public TestUser2 createFromParcel(Parcel p) {  
            return new TestUser2(p);  
        }  
  
        public TestUser2[] newArray(int size) {  
            return new TestUser2[size];  
        }  
    };  
	@Override
	public int describeContents() {
		// TODO Auto-generated method stub
		return 0;
	}
	@Override
	public void writeToParcel(Parcel dest, int flags) {
		/*
		 * 此处的顺序与TestUser2(p)构造函数中的顺序以及个数要一致,如果不一致会出现问题
		 */
		dest.writeString(username);
//		dest.writeString(psw);
		dest.writeInt(age);
	}
}

TestActivity1代码如下:
public class TestActivity1 extends Activity {

	private Button test1_btn;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.test1);
		test1_btn = (Button)findViewById(R.id.test1_btn);
		test1_btn.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent intent = new Intent(TestActivity1.this,TestActivity2.class);
				/*
				 * 方式二
				 */
				TestUser2 user2 = new TestUser2();
				user2.setAge(16);
				user2.setUsername("testname2");
				intent.putExtra("user2", user2);
				startActivity(intent);
			}
		});
	}
	
	
}

TestActivity2代码如下:
public class TestActivity2 extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.test2);
		Intent intent = getIntent();
		EditText test2_text = (EditText)findViewById(R.id.test2_text);

		
		/*
		 * Parcelable方式
		 */
		TestUser2 user2 = (TestUser2)intent.getParcelableExtra("user2");
		test2_text.setText(user2.getUsername()+user2.getAge());
	}
	
}
效果如下:
其中testname2 和16分别是username和age的值

注意:writeToParcel方法中的顺序要和TestUser2(Parcel p)构造函数的顺序和数量要一致


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值