标签:
Activity之间的数据传递
1传递简单数据
2传递数据包(Bundle)
3传递值对象
4获取Activity的返回参数
1------传递简单的数据
新建android工程,取名SendArgs,在activity_main.xml文件里添加一个按钮,用于启动另一个Activity,然后新建一个Activity(手动建class再extends Activity的,需要在AndroidManifest.xml文件里添加配置信息,建议直接新建android activity),取名Aty。
在MainActivity.java文件里修改onCreate函数
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btStartAty).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent i = new Intent(MainActivity.this,Aty.class);
startActivity(i);
}
});
}
以上为点击按钮,可跳转至另一个activity的代码,若要传递参数,则需在Intent i = new Intent(MainActivity.this,Aty.class);后添加代码:i.putExtra(“data”,”请叫我小志”);
然后在Aty.java文件中的onCreate方法中获取这个Extra,添加如下代码:
Intent i = getIntent();
TextView tv = (TextView) findViewById(R.id.tv);
tv.setText(i.getStringExtra("data"));
2------传递数据包(Bundle)
在MainActivity.java中修改代码
将i.putExtra(“data”,”请叫我小志”);修改为:
Bundle b = new Bundle();
b.putString("name", "小志");
b.putInt("age", 18);//bundle可以嵌套bundle
i.putExtras(b);//注意是putExtras(),不是putExtra()
然后再Aty.java文件里获取该Extra
Intent i = getIntent();
Bundle b = i.getExtras();
将tv.seText换为:
//name1不存在的话,默认值是aaa(自己定义),如果有值的话,就是该值
tv.setText(String.format("name=%s,age=%d,name1=%s",b.getString("name"),b.getInt("age"),b.getString("name1","aaa") ));
还有一种传递方式是i.putExtra("data", b);
此时Aty.java的获取方式是:
Bundle b = i.getBundleExtra("data");
3------传递值对象(自定义数据类型)
在src同包下创建User类,两个属性string name 和 int age 加上set/get和带参构造
然后再MainActivity中修改按钮的响应函数:
Intent i = new Intent(MainActivity.this,Aty.class);
i.putExtra("user", new User("小志",24));
写第二句的时候会提示出错,错误提示信息需要序列化,有两种方式第一种User类实现Serializable(java.io.Serializable)效率低,第二种是android.os.Parcelable 效率高
先看第一种:public class User implements Serializable
然后就可以在Aty里获取
Intent i = getIntent();
User user = (User) i.getSerializableExtra("user");
tv.setText(String.format("User info(name=%s,age=%d)",user.getName(),user.getAge()));
(之前声明tv的语句不能在setContentView(R.layout.activity_aty);之上)
第二种方式:public class User implements Parcelable
需实现两个函数
@Override
public int describeContents() {
return 0;
}
在第二个函数里添加代码:
@Override
public void writeToParcel(Parcel dest, int flag) {
//Parcelable没有全自动化的序列化机制,需要手动添加
dest.writeString(getName());
dest.writeInt(getAge());
}
还需要添加一个静态常量:
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel source) {
return new User(source.readString(),source.readInt());
}
@Override
public User[] newArray(int size) {
return new User[size];
}
};
在Aty中获取也需要用Parcelable
User user = i.getParcelableExtra("user");
4------获取Activity的返回参数
开启activity有两种方式
1.startActivity(intent) 如上述各例子
2.startActivityForResult(intent,requestCode);
onActivityResult(int requestCode,int resultCode,Intent data)
setResult(resultCode,data);
第二种方式可以将第二个页面的数据回传
第一个activity.java里:
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent,1);
第二个参数是请求的一个标识,程序若启动多个activity,则可通过该标识判断是哪个activity返回的,而且需重写onActivityResult方法,如下代码:
/*
* 通过startActivityForResult跳转,接收返回的数据的方法
* requestCode:请求的标识
* resultCode: 第二个页面返回的标识
* data:第二个页面回传的数据
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==1&&resultCode==2){
String content = data.getStringExtra("data");
tv.setText(content);
}
}
第二个页面中的按钮的响应函数改为:
Intent data = new Intent();
data.putExtra("data", “你好”);
setResult(2, data);
//结束当前页面
finish();
标签:
原文地址:http://www.cnblogs.com/QuietZhi/p/4634212.html