Fragment、Activity 的 startActivityForResult 的处理

来源:互联网 发布:qq输入法linux 编辑:程序博客网 时间:2024/05/16 14:07


在开发过程中经常使用打ViewPager 装载页面,也就是说 一个 Activity中存在 Fragment。然而 每一个 Fragment 都有自己的生命周期。

转自:http://news.tuxi.com.cn/itb/jameszhao84/blog/2208433.html

1.检查该Fragment所属的Activity中,是否重写了onActivityResult方法。

如果是该种情况,请确保写了super.onActivityResult:

@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK) {//Activity中相关处理代码}}


2.检查Fragment中的startActivityForResult的调用方式。

请确保不要使用getActivity().startActivityForResult方法,而是要直接使用startActivityForResult。


3.如果以上两方面都没能解决问题,很可能是如下情况了,略有复杂:

该情况是在support library中使用了Nested Fragment,就是说在Fragment中进行了嵌套,比如用ViewPager展示Fragment等情况。这可以算Google的一个Bug,具体可参见这篇博客:

http://blog.shamanland.com/2014/01/nested-fragments-for-result.html

解决方案:

最好的方式是写一个BaseActivity继承FragmentActivity,重写onActivityResult方法,你用到的Activity都继承BaseActivity来做。BaseActivity具体实现:


package com.jupaidaren.android;import java.util.List;import android.content.Intent;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentActivity;import android.support.v4.app.FragmentManager;import android.util.Log;abstract public class BaseActivity extends FragmentActivity {private static final String TAG = "BaseActivity";@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {FragmentManager fm = getSupportFragmentManager();int index = requestCode >> 16;if (index != 0) {index--;if (fm.getFragments() == null || index < 0|| index >= fm.getFragments().size()) {Log.w(TAG, "Activity result fragment index out of range: 0x"+ Integer.toHexString(requestCode));return;}Fragment frag = fm.getFragments().get(index);if (frag == null) {Log.w(TAG, "Activity result no fragment exists for index: 0x"+ Integer.toHexString(requestCode));} else {handleResult(frag, requestCode, resultCode, data);}return;}}/** * 递归调用,对所有子Fragement生效 *  * @param frag * @param requestCode * @param resultCode * @param data */private void handleResult(Fragment frag, int requestCode, int resultCode,Intent data) {frag.onActivityResult(requestCode & 0xffff, resultCode, data);List<Fragment> frags = frag.getChildFragmentManager().getFragments();if (frags != null) {for (Fragment f : frags) {if (f != null)handleResult(f, requestCode, resultCode, data);}}}}


0 0
原创粉丝点击