上一篇文章写了数据传递,这篇level up,来到数据回传。
一、时序图
先来看一下数据回传的一张时序图。startActivityForResult()、setResult()、onActivityResult()三者缺一不可~
1.startActivityForResult()
在数据传递中,我们使用startActivity()来打开下一个页面。在数据回传中,我们要使用startActivityForResult()来打开下一个页面,它的作用是:从A页面使用该方法跳转到B页面,当B页面销毁时,会从销毁的B页面将数据传回到A页面(注意是原来的那个A页面,不是新的A页面)。
2.setResult()
将B页面的数据回传到A页面
3.onActivityResult()
A页面接收回传的信息
二、步骤
了解三个方法后,我们开始进入数据回传的步骤。(以Login页面和Register页面为例)
1.startActivityForResult()
(1)格式
startActivityForResult(Intent intent, int requestCode);
//括号内有两个参数,第一个参数Intent表示意图对象,
第二个参数requestcode表示请求码,用于标识请求的来源。
//为何要用到请求码?
//设想一下如果我们的Login页面有多个按钮的点击事件中都要跳转到Register页面,
//那么多页面,该如何判断我们Login回收到的数据是从哪个按钮的点击事件从跳转过来的呢?
//这时候就需要用请求码来标识我们的每个跳转按钮~这样才能清楚明白请求的来源
(2)例子
//设计一个Register的点击事件
Register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//设置跳转到的Activity页面
Intent intent = new Intent();
intent.setClass(Login.this, Register.class);
//用startActivityForResult()开启Register页面
startActivityForResult(intent, Register_RequestCode);
}
});
第一个步骤在Login页面完成√,接下来暂时让Login页面休息,来到Register页面
2.setResult()
(1)格式
setResult(int resultCode,Intent intent)
//第一个参数是返回码,用于标识返回的数据来自哪一个Activity
//第二个参数Intent用于携带数据并回传到上一个Activity
(2)例子
//还是用到了putextra()在Intent对象中存储数据
Intent intent=new Intent();
intent.putExtra("key",name.getText().toString());
//toString()不是必要的,但是如果是初学者的话建议都加上toString()
//确保数据都转化成字符型
//name.getText()是从Register页面中获得到的数据
setResult(RESULT_OK,intent);
finish();
//不要忘记用finish()销毁当前页面,这样才能回到原来的Login页面
//这里有个注意点,不要在finish前面加上页面跳转方法
//亲身经历,在做数据回传的时候,在finish前面加上了从Register跳转到Login,
//导致我尝试了很多次数据一直回传不过去,原因在于我加上了页面跳转,Register跳转之后
//的Login页面是一个新页面,没办法获取到回传的数据。
//因为这个原因卡了我好久...脑袋晕晕QAQ
到这里,Register页面的任务已经完成,回到Login页面
3.onActivityResult()
Login接收从Register回传的数据
(1)格式
onActivityResult(int requestCode,int resultCode,Intent data)
(2)例子
//不要手敲这一长串,敲个onActivityResult找到以下格式
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==Register_RequestCode){
if(resultCode==RESULT_OK){
String name1=data.getStringExtra("key");
Log.v("login","传递了name"+name);//打个log看看有没有获取到数据
Rev.setText(name1);//在Login页面中显示出获取到的数据
//Rev是绑定的控件名,是我们要显示出回收到的数据的输入框。
//所以记得要绑定!具体的在数据传递中有写
}
}
}
到这就结束啦
三、关于请求码和返回码
请求码和返回码我们都可以直接在格式里面设定
startActivityForResult(intent, 1);//设定了请求码是“1”
setResult(2,intent);//设定了返回码是“2”
也可以现在前面定义
over~