Android中Activity之间参数传递
来源:互联网 发布:电脑抽奖软件下载 编辑:程序博客网 时间:2024/05/17 03:44
Intent:一直穿梭在Activity之间,它不光只是为了使Activity之间进行跳转。在跳转的时候,还可以进行Acivity之间的参数传递。
下面举几个列子。以MianActivity,TheActivity为例子。
MianActivity类
Intent i = new Intent(MianActivity.this,TheActivity.class);
//这里就可以传入你想要传递的参数了,第一个参数是数据名,可以根据自己爱好或者工作需求命名。第二个就是传递的参数,可以是字符串,int值,也就是数据基本类型。
i.putExtra("name","小猫");
i.putExtra("age","18");
startActivity(i);
TheAcivity类
Intent i = getIntent();
String name = i.getStringExtra("name");
String age = i.getStringExtra("age");
这样就可以得到你想要从MianAcitivity传入的参数。
上面说的是传递简单的数据基本类型,可现实往往不会被它们所满足,当数据比较多的时候,这样的传递就会显得比较复杂。于是,Android推出了一个新的概念,数据包(Bundle)。
MianActivity类
Intent i = new Intent(MianActivity.this,TheActivity.class);
Bundle b = new Bundle();
b.putString("name", "小猫");
b.putInt("age", 13);
i.putExtras(b);
TheAcivity类
Intent i = getIntent();
Bundle data = i.getExtras();
tv.setText(String.format("name=%s,age=%d,name1=%s", data.getString(age),data.getStringArray(name),data.getString("name1", "leo")));
在这里,你会发现。从Activity中,并没有传入name1。所以在这里我给了它他一个默认值(leo);
defaultValue:表示在传入的参数为空的时候,可以默认一个写入一个参数
这个时候的运行结果:
当我们给我一个值得时候
b.putInt("name1", "iwen");
这个时候的运行结果:
Bundle还有一种传递方式
MianActivity类
Intent i = new Intent(MianActivity.this,TheActivity.class);
Bundle b = new Bundle();
b.putString("name", "小猫");
b.putInt("age", 13);
// i.putExtras(b);
i.putExtra(“data”,b);
TheAcivity类
Intent i = getIntent();
// Bundle data = i.getExtras();
Bundle data = i.getBundleExtra("data");
tv.setText(String.format("name=%s,age=%d,name1=%s", data.getString(age),data.getStringArray(name),data.getString("name1", "leo")));
运行结果同上。
可能在这上面,你并不满足,因为他达不到你所有的需求。而且看起数据比较扎乱。比如,如何传入实体类(自定义)的数据。
首先,建造一个实体类
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
MianActivity类
Intent i = new Intent(MianActivity.this,TheActivity.class);
i.putExtra("User", new User("小猫", 2));
startActivity(i);
当这样写的时候,程序就会报错,因为i.putExrra();方法不支持传入一个实体类(自定义),需要实例化。怎么解决呢?这个时候,系统就会给我们两个选择。
第一个,实体类实现序列化,修改实体类
public class User implements Serializable{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
这样,MianActivity类就不会报错了,现在就只剩下TheAcivity类,取数据。
TheAcivity类
Intent i = getIntent();
User user = (User) i.getSerializableExtra("User");
tv.setText(String.format("User info(anme=%d,age=%s)", user.getName(),user.getAge()));
第二个,使用android自己提供的序列化(Parcelable)。使用这个接口,他需要实现连个发describeContents();writeToParcel();修改实体类(自定义)
public class User implements Parcelable{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
//不用管
@Override
public int describeContents() {
return 0;
}
//因为Parcelable没有全自动话的序列机制,所以需要自己手写。
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(getName());
dest.writeInt(getAge());
}
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel source) {
//当数据类型多的时候,或者大量相同数据类型的时候,可以使用source.readBundle();方法
return new User(source.readString(), source.readInt());
}
@Override
public User[] newArray(int size) {
return new User[size];
}
};
这个时候只需要稍微修改一下TheAcivity类就可以了
TheAcivity类
Intent i = getIntent();
User user =i.getParcelableExtra("User");
tv.setText(String.format("User info(anme=%d,age=%s)", user.getName(),user.getAge()));
这两种方式有何区别呢?第一种Serializable操作简单,一切都是由系统帮助程序系列化,它的缺点就是运行慢。速度慢。第二种Parcelable是android提供的接口,操作比较复杂,但它的速度是非常快的,因为很多东西都是需要自己写的。
如何将TheAcivity类的数据返回给MainActivity类呢?
Intent i = new Intent();
//这里可以写你想要出入的参数
i.putExtra("data", tv.getText().toString());
//第一个参数代表请求码,这里的1代表返回结果成功。第二个参数代表放回的数据
setResult(1,i);
MianActivity类
这个时候startActivity();方法已经不行了,需要换成
startActivityForResult(i, 0);//第一个参数代表返回的数据,第二个参数代表参数状态。
还需要重写onActivityResult()方法将返回结果进行处理、分析。
//第一个参数代表请求码,根据它可以判断请求的意义是什么。第二个参数代表返回码,根据它可以判断放回的状态。第三个参数代表返回值
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// 这里可以获取返回的数据data
super.onActivityResult(requestCode, resultCode, data);
}
%在跳转的时候,需要在AndroidManifest.xml中为你Activity注册。<activity android:name="com.example.intentstartactivity.TheActivity"></activity>%
新手初入,望。大神指点,同行留言交流。
- Android中Activity之间传递参数
- Android中Activity之间参数传递
- Android中Activity之间参数传递
- android activity之间传递参数
- android activity之间传递参数
- android activity之间参数传递
- Android Activity之间参数传递
- android中传递复杂参数,activity之间和fragment之间的bundle传递集合/对象
- android中传递复杂参数,activity之间和fragment之间的bundle传递集合/对象
- android中传递复杂参数,activity之间和fragment之间的bundle传递集合/对象
- android Activity之间的参数传递
- Android:Activity之间跳转和参数传递
- android在 Activity 之间传递参数
- Android:Activity之间传递参数并跳转
- activity之间参数传递
- activity之间参数传递
- activity之间参数传递
- activity之间参数传递
- MongoDB数据库备份
- 苹果微信web无法提交form表单问题解决
- PAT-1009
- mapreduce 二次排序后reduce输出中key的变化
- H264参数结构一:元素的分层结构
- Android中Activity之间参数传递
- linux编译libevent
- H264参数结构一:元素的分层结构
- imatest中colorcheck的使用
- Activity保存状态(三)
- AndroidStudio与Java8(一)
- 字符串比较==和equel区别
- Vue.js Demo 数据及其列表操作
- 20170425 程序员的成长和代码行数的关系