正常界面A点击按钮a,跳转到界面B,
然后界面B点击按钮b,跳转到界面A,这时要求界面A打印出界面B返回的数据。
上面情景就是一个简单的activity返回传值业务。
常规写法就是:
1、在界面A的activity中调用一次startActivityForResult方法跳转到界面B。
2、在界面A的activity中还要复写一个onActivityResult方法,负责监听返回传值。
3、在界面B调用一次setResult方法负责返回传值。
本次封装的重点在于,将上面的1和2两步合并。将常规写法节约一步。
这样在编写需要返回传值的业务的时候就不需要,完成了第一步,还要找到onActivityResult方法,去编写监听。
下面开始上代码:
BaseActivity.java
public class BaseActivity extends AppCompatActivity {
private ReturnActivityListener listener;
public void startActivityForResult(Intent intent, int requestCode, ReturnActivityListener listener){
super.startActivityForResult(intent,requestCode);
this.listener = listener;
}
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data){
listener.onResult(requestCode,resultCode,data);
super.onActivityResult(requestCode,resultCode,data);
}
public interface ReturnActivityListener{
void onResult(int requestCode,int resultCode,Intent data);
}
}
这样简单的基类就封装好了。具体使用在后面有代码,这里先解释一下上面的代码。
首先继承AppCompatActivity毫无疑问;
然后第一个方法startActivityForResult,这个方法相比“常规页面返回传值”的startActivityForResult方法,多了一个参数ReturnActivityListener,这个参数就是我们的返回监听了,在我们需要调用startActivityForResult的时候,类似做按钮控件监听一样,写一个匿名内部类,在里面编写返回监听的逻辑即可。
再然后第二个方法onActivityResult,这个方法就是调用一下接口ReturnActivityListener里面的onResult方法,这样就会执行上面编写匿名内部类里面的逻辑了。
上面讲的看不懂没关系额,下面上使用的代码,会使用了在研究也来得及。
1、编写两个Activity类,顺便写好他们的xml文件。每个xml文件里一个TextView控件,当按钮用。
2、界面A的核心代码:
YmczActivity1.java:
TextView t1 = findViewById(R.id.ymtz1_tv_btn1);
t1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Intent i = new Intent();
i.setClass(YmtzActivity1.this,YmtzActivity2.class);
startActivityForResult(i,1000,new ReturnActivityListener(){
@Override
public void onResult(int requestCode,int resultCode,Intent data){
if(requestCode == 1000&&resultCode==500){
System.out.println("data.getStringExtra("fanhuizhi"));
}
}
});
}
});
这里可以看到就是将原来写在onAcitityResult里面的代码,放进这里面了,这样就不需要再去复写onAcitityResult这个方法了。
接下来是界面B的核心代码:
YmtzActivity2.java:
TextView t1 = findViewById(R.id.ymtz2_tv_btn1);
t1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
Intent i = new Intent();
i.putExtra("fanhuizhi","我返回了");
setResult(500,i);
finish();
}
});
这个就是正常写法,也就是最开始说的“常规写法”的第3步,没有改变。
这个时候运行项目,发现效果和“常规写法”效果相同,但是少写了一个返回监听。而且在编写页面跳转的时候就直接编写监听,思路比较清晰,方便后期阅读。
ps:本文代码纯文本手敲,可能有地方直接粘贴复制到编译器会飘红,看官留心。