一、Activity页面之间的数据传递有4种方式,在这里我就简单的用代码来和大家讲一下怎么去用,以及一些注意事项。
二、哪四种?
1、传递基本数据类型
2、传递Bundle
3、传递对象
4、传递对象集合
三、首先我先把XML布局文件代码放出来,这样的话就方便后面查看代码的时候,免得大家看不懂。
xml布局代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" tools:context="com.zking.laci.android12.MainActivity"
android:orientation="vertical"
>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_main"
android:hint="请输入用户名"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="写心情"
android:onClick="write"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv_main"
/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.zking.laci.android12.ThinkActivity"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv_think"
/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请写心情"
android:id="@+id/et_think"
android:lines="5"
android:gravity="top"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="发送"
android:onClick="ok"
/>
</LinearLayout>
四、接下来我就把Java代码放出来,里面有四种传递数据的方式
因为这里有种是传递对象,因此,我会先放一个实体类上来,需要注意的是:传递对象和传递对象集合是实现完全不同的类的,而且对象集合在实现过程中,需要重写一些方法。
package com.zking.entity;
import android.os.Parcel;
import android.os.Parcelable;
import java.io.Serializable;
/**
* Created by Laci on 2017/6/16.
*/
/**
* 传递对象实现Serializable类,传递对象集合实现Parcelable类,并重写相对应的方法
*/
public class Person implements Parcelable{
private int pid;
private String pname;
private int page;
protected Person(Parcel in) {
pid = in.readInt();
pname = in.readString();
page = in.readInt();
}
public static final Creator<Person> CREATOR = new Creator<Person>() {
@Override
public Person createFromParcel(Parcel in) {
return new Person(in);
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
public void setPid(int pid) {
this.pid = pid;
}
public void setPname(String pname) {
this.pname = pname;
}
public void setPage(int page) {
this.page = page;
}
public int getPid() {
return pid;
}
public String getPname() {
return pname;
}
public int getPage() {
return page;
}
public Person(int pid, String pname, int page) {
this.pid = pid;
this.pname = pname;
this.page = page;
}
@Override
public String toString() {
return "Person{" +
"pid=" + pid +
", pname='" + pname + '\'' +
", page=" + page +
'}';
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(pid);
dest.writeString(pname);
dest.writeInt(page);
}
}
之后就是两个布局文件相对应的Activity的代码了
package com.zking.laci.android12;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import com.zking.entity.Person;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private TextView tv;
private EditText et;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//通过ID来获取下相对应的控件
et = (EditText) findViewById(R.id.et_main);
tv = (TextView) findViewById(R.id.tv_main);
}
public void write(View v){
String uname=et.getText().toString();
Intent i=new Intent(this,ThinkActivity.class);
//方法一、传递基本数据类型
//i.putExtra("uname",uname);
//方法二、传递Bundle
// Bundle b=new Bundle();
// b.putString("uname",uname);
// i.putExtra("b",b);
//方法三、传递对象
// Person p=new Person(1,uname,20);
// i.putExtra("p",p);
//方法四、传递对象集合
ArrayList lt=new ArrayList();
Person p1=new Person(1,uname,20);
Person p2=new Person(2,uname,30);
Person p3=new Person(3,uname,40);
lt.add(p1);
lt.add(p2);
lt.add(p3);
i.putParcelableArrayListExtra("lt",lt);
//带有目的的传
startActivityForResult(i,0x201);
}
//得到从另一个页面返回的结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
String content=data.getStringExtra("content");
tv.setText(content);
}
package com.zking.laci.android12;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import com.zking.entity.Person;
import java.util.List;
public class ThinkActivity extends AppCompatActivity {
private TextView tv;
private EditText et;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_think);
tv = (TextView) findViewById(R.id.tv_think);
et = (EditText) findViewById(R.id.et_think);
//获取第一个页面传递过来的数据
// String uname=getIntent().getStringExtra("uname");
//接收Bundle
// Bundle b=getIntent().getBundleExtra("b");
// String uname=b.getString("uname");
//接收对象
// Person p= (Person) getIntent().getSerializableExtra("p");
//接收对象集合
List<Person> lt=getIntent().getParcelableArrayListExtra("lt");
for (Person person : lt) {
tv.setText(tv.getText()+person.toString());
}
}
public void ok(View v){
String content=et.getText().toString();
Intent i=new Intent();
i.putExtra("content",content);
//设置结果
setResult(0x1,i);
//自杀(干掉自己,干掉当前的Activity)
finish();
}
}
那么到这里,四种传递方式也就到此为止了,有什么问题可以提出来,我们一起讨论讨论!