Android中Activity之间参数传递
2016-08-17 16:49
369 查看
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);
}
这样就可以得到你想要从MianAcitivity传入的参数。
%在跳转的时候,需要在AndroidManifest.xml中为你Activity注册。<activity android:name="com.example.intentstartactivity.TheActivity"></activity>%
新手初入,望。大神指点,同行留言交流。
下面举几个列子。以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);
}
这样就可以得到你想要从MianAcitivity传入的参数。
%在跳转的时候,需要在AndroidManifest.xml中为你Activity注册。<activity android:name="com.example.intentstartactivity.TheActivity"></activity>%
新手初入,望。大神指点,同行留言交流。
相关文章推荐
- Android:Activity之间跳转和参数传递
- Android学习(Activity之间的参数传递)
- Android:Activity之间跳转和参数传递
- Android 学习笔记3(Activity之间参数传递)
- Android:Activity之间跳转和参数传递
- Android 关于 Activity 之间的切换动画
- Android的Activity之间的通信
- Android判断网络状态是否断开+Android完全关闭应用程序+ 本文讲述了Android中不同Activity之间的数据传递 — Bundle对象的实现(-)+Android中Bundle的使用示例
- Android开发入门(五)之界面Activity之间的跳转
- 在Android中,通过extras在activity之间传递数据
- android Intent实现Activity之间跳转并传值
- Android 2个activity 之间的数据传递
- android的一些提示框 以及activity之间数据的传递
- Android中Activity和Intent之间的联系
- android 应用程序Activity之间数据传递与共享的几种途径(1)
- android 应用程序Activity之间数据传递与共享的几种途径(2)
- android:cha1.2 通过Intent实现Activity之间的通信
- Android 开发中各Activity之间数据共享
- 【Android游戏开发之五】游戏注册界面Demo-实现两个Activity之间的切换与数据交互!
- android 开发之activity之间传递数据