在 Activity 之间传递参数
1 传递简单数据
首先完成页面的跳转,http://blog.csdn.net/a905206271/article/details/70193889,里面有,实现跳转后,
Intent i=new Intent(MainActivity.this,Main2Activity.class);
i.putExtra("data","test");
startActivity(i);
putExtra有很多重置函数,第一个参数是key用来唯一识别这个数据,第二个参数是传入的数值。
这样就能把内容传到另一activity,在另一activity中通过Intent i=getIntent();来接受数据
接受到数据之后,就想办法将内容显示出来。先拖一个text控件,然后在源码中通过findViewById;
找到该控件
具体代码为
//创建一个TextView类型的对象
private TextView tv;
//获取控件,并且强制转换
//findViewById获取的是一个view值,所以如果不转换,就会报错
2 数据包传递tv= (TextView) findViewById(R.id.tv);
//通过.setText将值写入,这里是通过data找到数据的。
tv.setText(i.getStringExtra("data"));
用bundle来传递数据包
//先建立一个bundle对象
Bundle b=new Bundle();
//用put来传入数据,根据传入数据类型的不同,使用的函数也不同
b.putString("name","帅李岩");
b.putString("name1","丑汪浩");
b.putInt("age",22);
//使用putExtras来将数据传递,注意包用putExtras,不过也可以用i.putExtra("data",b);
i.putExtras(b);
在接受代码中
Bundle data=i.getExtras("data");
tv.setText(String.format("name=%s age:=%d ",data.getString("name"),data.getInt("age")));
通过data.get来获取传入的数据,如果之前使用的是
i.putExtra("data",b);
则使用
Bundle data=i.getBundleExtra("data");
关于获取数据,可以用data.getString("name1","傻波波")
如果没有找到,就输出傻波波,如果有就输入原有值,这样可以防止为空
3 传递值对象
首先在包里创建一个类
然后完成定义
private String name;
private int age;
public Person(String name, int age){
this.age=age;
this.name=name;
}
直接右键找到generate
然后
点击Getter and Setter
然后点击ok就行了。
然后在MainActivity中按之前的方法写
putExtra可以传入类
i.putExtra("data",new Person("liyan",2));
这会报错,查看错误,有两种方法,
public class Person implements Serializable
public class Person implements Parcelable
serializable比较好用,这是java内置的接口
系统会自动帮你完成序列化,但是和Parcelable比,效率低
获取信息
Person person= (Person) i.getSerializableExtra("data");
写入信息
tv= (TextView) findViewById(R.id.tv);
tv.setText(String.format("name2=%s,age2=%d",person.getName(),person.getAge()));
Parcelable使用复杂一些,当使用Parcelable接口的时候会报错,根据提示实现两个方法
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
}
先修改第二个函数
public void writeToParcel(Parcel dest, int flags) { dest.writeString(getName()); dest.writeInt(getAge()); }
然后
用自动提醒获取代码,记得加分号
public static final Creator<Person>CREATOR=new Creator<Person>() {
@Override
public Person createFromParcel(Parcel source) {
return null;
}
@Override
public Person[] newArray(int size) {
return new Person[0];
}
};
然后修改
public static final Creator<Person>CREATOR=new Creator<Person>() {
@Override
public Person createFromParcel(Parcel source) {
return new Person(source.readString(),source.readInt());
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
记得修改一下获取代码
//Person person= (Person) i.getSerializableExtra("data");
Person person=i.getParcelableExtra("data");
如果有多个同种数据,可以使用Bundle
也可以这样
我新建了一个name1
public void writeToParcel(Parcel dest, int flags) { dest.writeString(getName()); dest.writeString(getName1()); dest.writeInt(getAge()); } public static final 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]; } }; public Person(Parcel source){ name1=source.readString(); name=source.readString(); age=source.readInt(); }
记得修改两个activity。
4 获取 Activity 的返回参数
现在第二个activity中拖一个button和editText,设置点击响应,在响应函数中
//intent用来进行不同activity之间的交互
Intent i=new Intent();
//获取写入的数据,写入i中
i.putExtra("data",editText.getText().toString());
//利用result来使其返回
setResult(1,i);
//然后使用finish结束,使其返回上一activity
finish();
在原activity中添加代码,将
startActivity(i);改为
startActivityForResult(i,0);
使其可以回传
然后添加函数
用onac就可以直接提醒出代码
requestCode是请求码
startActivityForResult(i,0);即这里面的0
resultCode是响应码
setResult(1,i);级这里面的1
然后获取textview的值
获取了返回参数