startActivityForResult用法详解
当前Activity(A界面)要打开另一个Activity(B界面)并传递值,然后关闭(B界面)返回到当前Activity(A界面)并传值,这样的需求需要用到是startActivityForResult打开方式
当前aActivity(A界面)代码
public static final int REQUESTCODE = 0;
model为在aActivity中需要传的值
@Override public void onClick(View v) { switch (v.getId()) { case R.id.activity_form_save: editAction(); break; } }
此为打开bActivity代码private void editAction() {
Intent intent = new Intent(this, bActivity.class);
intent.putExtra("model", model);
startActivityForResult(intent, REQUESTCODE);}
PS:当前aActivity必须要重写onActivityResult方法来对将来的bActivity关闭并返回值做出回应。
requestCode 请求码,即调用startActivityForResult()传递过去的值
resultCode 结果码,结果码用于标识返回数据来自哪个新Activity
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { switch (requestCode) { case REQUESTCODE: model = data.getSerializableExtra("model"); initData(); adapter.notifyDataSetChanged();比如这类操作,这是我需要的,因情况而定 break; } } }
bActivity(B界面)代码
modelb为bActivity中的值
Button btnClose=(Button)findViewById(R.id.btnClose); btnClose.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { //数据是使用Intent返回 Intent data = new Intent(); //把返回数据存入Intent data.putExtra("result", modelb); //设置返回数据 bActivity.this.setResult(RESULT_OK, data); //关闭Activity bActivity.this.finish(); } });
请求码的作用 使用startActivityForResult(Intent intent, int requestCode)方法打开新的Activity,我们需要为startActivityForResult()方法传入一个请求码(第二个参数)。请求码的值是根据业务需要由自已设定,用于标识请求来源。例如:一个Activity有两个按钮,点击这两个按钮都会打开同一个Activity,不管是那个按钮打开新Activity,当这个新Activity关闭后,系统都会调用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法。在onActivityResult()方法如果需要知道新Activity是由那个按钮打开的,并且要做出相应的业务处理,这时可以这样做: @Override public void onCreate(Bundle savedInstanceState) { .... button1.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 1); } }); button2.setOnClickListener(new View.OnClickListener(){ public void onClick(View v) { startActivityForResult (new Intent(MainActivity.this, NewActivity.class), 2); } }); @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch(requestCode){ case 1: //来自按钮1的请求,作相应业务处理 case 2: //来自按钮2的请求,作相应业务处理 } } } 结果码的作用 在一个Activity中,可能会使用startActivityForResult()方法打开多个不同的Activity处理不同的业务,当这些新Activity关闭后,系统都会调用前面Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法。为了知道返回的数据来自于哪个新Activity,在onActivityResult()方法中可以这样做(ResultActivity和NewActivity为要打开的新Activity): public class ResultActivity extends Activity { ..... ResultActivity.this.setResult(1, intent); ResultActivity.this.finish(); } public class NewActivity extends Activity { ...... NewActivity.this.setResult(2, intent); NewActivity.this.finish(); } public class MainActivity extends Activity { // 在该Activity会打开ResultActivity和NewActivity @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch(resultCode){ case 1: // ResultActivity的返回数据 case 2: // NewActivity的返回数据 } } }
以上内容希望对大家有所帮助