Fragment Activity 中startActivityForResult的回调
通过startActivityForResult在两个Activity之间传递数据应该没有任何问题,标准的模式为:
- package com.ljq.activitys;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.widget.Button;
- public class MainActivity extends Activity {
- private final static String TAG="MainActivity";
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Button btnOpen=(Button)this.findViewById(R.id.btnOpen);
- btnOpen.setOnClickListener(new View.OnClickListener(){
- public void onClick(View v) {
- //得到新打开Activity关闭后返回的数据
- //第二个参数为请求码,可以根据业务需求自己编号
- startActivityForResult(new Intent(MainActivity.this, OtherActivity.class), 1);
- }
- });
- }
- /**
- * 为了得到传回的数据,必须在前面的Activity中(指MainActivity类)重写onActivityResult方法
- *
- * requestCode 请求码,即调用startActivityForResult()传递过去的值
- * resultCode 结果码,结果码用于标识返回数据来自哪个新Activity
- */
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- String result = data.getExtras().getString("result");//得到新Activity 关闭后返回的数据
- Log.i(TAG, result);
- }
- }
- package com.ljq.activitys;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.Button;
- public class OtherActivity extends Activity {
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.other);
- Button btnClose=(Button)findViewById(R.id.btnClose);
- btnClose.setOnClickListener(new View.OnClickListener(){
- public void onClick(View v) {
- //数据是使用Intent返回
- Intent intent = new Intent();
- //把返回数据存入Intent
- intent.putExtra("result", "My name is linjiqin");
- //设置返回数据
- OtherActivity.this.setResult(RESULT_OK, intent);
- //关闭Activity
- OtherActivity.this.finish();
- }
- });
- }
- }
这个情况下代码如下:
FragmentA中:
- Intent intent = new Intent(getActivity(),
- FinanceHomeActivity.class);
- Bundle b = new Bundle();
- b.putString("url", ConfigCommerce.getInstance().financeUrl);
- intent.putExtras(b);
- startActivityForResult(intent,1);
- //////////////////////////////////////////////////////////////////////////
- @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- LogUtils.d("FianceCardFragment", "onActivityResult");
- super.onActivityResult(requestCode, resultCode, data);
- if(requestCode==1&&resultCode==100){
- if (EPApp.getApp().isLogon()) {
- finNetHelper.requestFinanceAssets();
- }
- }
- }
FragmetnB中代码如下:
- if (getFragmentManager().getBackStackEntryCount() == 0) {
- getActivity().setResult(100);
- getActivity().finish();
- return;
- }
- getFragmentManager().popBackStack();
还有一种情况:如图
ActivityA中有一个fragmentA,该fragmentA中有一个listView,我们自定义一个adapter,在自定义adapter中startActivityForResult,此时我们需要注意的是在adapter中使用的时候要使用当前fragmentA的startActivityForResult,否则回调的时候会回调的ActivityA具体代码:
自定义adapter
使用的fragmetn.startActivityForResult,那我们在构造函数的时候把当前FragmentA的this传过去就ok
- Intent intent = new Intent(context,
- ActivityB.class);
- Bundle bundle = new Bundle();
- bundle.putString("orderNo", list.get(position).orderNo);
- intent.putExtras(bundle);
- fragmemt.startActivityForResult(intent, 0);
- @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- if (resultCode == SUCCESS_DETAILS) {
- ///
- }
- }
FragmetnB
- getActivity().setResult(SUCCESS_DETAILS);
- getActivity().finish();
从官方的解释中可以看出Fragment中的startActivityForResult方法是调用的是Activity中的,而FragmentActivity中的startActivityForResult方法是对Activity中的startActivityForResult进行了重写。所以我们调用Fragment的startActivityForResult方法,当启动的Activity返回后,在FragmentActivity的onActivityResult方法会被调用但无法获取到正确的请求码,如果调用FragmentActivity中的startActivityForResult方法,当启动的Activity返回后Fragment的onActivityResult方法是不会被调用的。
总结:
如果要在Fragment中启动Activity并且要求返回结果,有两种结果方案:
第一种:调用Fragment的startActivityForResult方法,然后在Fragment的onActivityResult的方法中处理返回的请求。
第二种:在Fragment中通过getActivity()方法获取到Fragment所在的FragmentActivity对象,调用activity对象的startActivityForResult方法启动Activity,然后在FragmentActivity的onActivityResult的方法中处理返回的请求。