Fragment Activity 中startActivityForResult的回调

通过startActivityForResult在两个Activity之间传递数据应该没有任何问题,标准的模式为:

[java]  view plain  copy
  1. package com.ljq.activitys;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.util.Log;  
  7. import android.view.View;  
  8. import android.widget.Button;  
  9.   
  10. public class MainActivity extends Activity {  
  11.     private final static String TAG="MainActivity";  
  12.       
  13.     @Override  
  14.     public void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.main);  
  17.           
  18.         Button btnOpen=(Button)this.findViewById(R.id.btnOpen);  
  19.         btnOpen.setOnClickListener(new View.OnClickListener(){  
  20.             public void onClick(View v) {  
  21.                 //得到新打开Activity关闭后返回的数据  
  22.                 //第二个参数为请求码,可以根据业务需求自己编号  
  23.                 startActivityForResult(new Intent(MainActivity.this, OtherActivity.class), 1);  
  24.             }  
  25.         });  
  26.     }  
  27.       
  28.     /** 
  29.      * 为了得到传回的数据,必须在前面的Activity中(指MainActivity类)重写onActivityResult方法 
  30.      *  
  31.      * requestCode 请求码,即调用startActivityForResult()传递过去的值 
  32.      * resultCode 结果码,结果码用于标识返回数据来自哪个新Activity 
  33.      */  
  34.     @Override  
  35.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  36.         String result = data.getExtras().getString("result");//得到新Activity 关闭后返回的数据  
  37.         Log.i(TAG, result);  
  38.     }  
  39. }  
[java]  view plain  copy
  1. package com.ljq.activitys;  
  2.   
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.os.Bundle;  
  6. import android.view.View;  
  7. import android.widget.Button;  
  8.   
  9. public class OtherActivity extends Activity {  
  10.   
  11.     @Override  
  12.     protected void onCreate(Bundle savedInstanceState) {  
  13.         super.onCreate(savedInstanceState);  
  14.         setContentView(R.layout.other);  
  15.   
  16.         Button btnClose=(Button)findViewById(R.id.btnClose);  
  17.         btnClose.setOnClickListener(new View.OnClickListener(){  
  18.             public void onClick(View v) {  
  19.                 //数据是使用Intent返回  
  20.                 Intent intent = new Intent();  
  21.                 //把返回数据存入Intent  
  22.                 intent.putExtra("result""My name is linjiqin");  
  23.                 //设置返回数据  
  24.                 OtherActivity.this.setResult(RESULT_OK, intent);  
  25.                 //关闭Activity  
  26.                 OtherActivity.this.finish();  
  27.             }  
  28.         });  
  29.           
  30.     }  
  31.   
  32. }  


那如果我们在一个Fragment中去使用startActivityForResult时,又是一个什么情况呢?先看流程图:



  这个情况下代码如下:

  FragmentA中:

[java]  view plain  copy
  1. Intent intent = new Intent(getActivity(),  
  2.  FinanceHomeActivity.class);  
  3.                     Bundle b = new Bundle();  
  4.                     b.putString("url", ConfigCommerce.getInstance().financeUrl);  
  5.                     intent.putExtras(b);  
  6.                     startActivityForResult(intent,1);  
  7.   
  8.   
  9. //////////////////////////////////////////////////////////////////////////  
  10.   
  11.   
  12.     @Override  
  13.     public void onActivityResult(int requestCode, int resultCode, Intent data) {  
  14.         LogUtils.d("FianceCardFragment""onActivityResult");  
  15.         super.onActivityResult(requestCode, resultCode, data);  
  16.         if(requestCode==1&&resultCode==100){  
  17.             if (EPApp.getApp().isLogon()) {  
  18.                 finNetHelper.requestFinanceAssets();  
  19.             }  
  20.         }  
  21.           
  22.           
  23.     }  

FragmetnB中代码如下:

[java]  view plain  copy
  1. if (getFragmentManager().getBackStackEntryCount() == 0) {  
  2.     getActivity().setResult(100);  
  3.     getActivity().finish();  
  4.     return;  
  5. }  
  6. getFragmentManager().popBackStack();  



还有一种情况:如图


ActivityA中有一个fragmentA,该fragmentA中有一个listView,我们自定义一个adapter,在自定义adapter中startActivityForResult,此时我们需要注意的是在adapter中使用的时候要使用当前fragmentA的startActivityForResult,否则回调的时候会回调的ActivityA具体代码:

 自定义adapter

使用的fragmetn.startActivityForResult,那我们在构造函数的时候把当前FragmentA的this传过去就ok

[java]  view plain  copy
  1. Intent intent = new Intent(context,  
  2.                      ActivityB.class);  
  3.              Bundle bundle = new Bundle();  
  4.              bundle.putString("orderNo", list.get(position).orderNo);  
  5.              intent.putExtras(bundle);  
  6.              fragmemt.startActivityForResult(intent, 0);  
FragmentA代码:

[java]  view plain  copy
  1. @Override  
  2.   public void onActivityResult(int requestCode, int resultCode, Intent data) {  
  3.       super.onActivityResult(requestCode, resultCode, data);  
  4.       if (resultCode == SUCCESS_DETAILS) {  
  5.         ///  
  6.       }  
  7.   }  

FragmetnB

[java]  view plain  copy
  1. getActivity().setResult(SUCCESS_DETAILS);  
  2.                               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的方法中处理返回的请求。

猜你喜欢

转载自blog.csdn.net/hanfengzqh/article/details/80016056