您的位置:首页 > 移动开发 > Android开发

Android Fragment中startActivityForResult不执行回调。

2016-06-23 17:56 387 查看
在ViewPager中的Fragment不执行回调,解决步骤:

1.检查Fragment中的onActivityResult()方法中是否写了super.onActivityResult,切记这里千万不要手贱给删了。不然就像我懵逼了半个多小时。

2.检查Fragment中的startActivityForResult的调用方式,不要getActivity().startActivityForResult(),因为这样会让回调回到Activity中。直接startActivityForResult() 或者 用 Fragment.this.去调用。

3.检查你setResult时,是否有onBackPressed()这种方法, setResult()这个方法得写在super.onBackPressed()方法前,否则resultCode 用于是0 接收不到。

如果以上还没有解决你问题,那么只能用下面的方法了:

public class BaseFragmentActiviy extends FragmentActivity {
private static final String TAG = "BaseActivity";

@Override
protected 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);
}
}
}
}


使用的时候继承自这个方法,启动的时候使用下面的方法

/**
* 得到根Fragment
*
* @return
*/
private Fragment getRootFragment() {
Fragment fragment = getParentFragment();
while (fragment.getParentFragment() != null) {
fragment = fragment.getParentFragment();
}
return fragment;

}

/**
* 启动Activity
*/
private void onStartActivityTest() {
Intent intent = new Intent();
intent.setClass(getActivity(), TestActivity.class);
intent.putExtra("TAG","richard test start!");
getRootFragment().startActivityForResult(intent, 1001);
}


当然这个方法,可能在以前老的编译环境下用得着。6.0的系统开发环境上是用不着的,源码启动方式发生了改变,google对这个问题进行了修复。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: