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 接收不到。
如果以上还没有解决你问题,那么只能用下面的方法了:
使用的时候继承自这个方法,启动的时候使用下面的方法
当然这个方法,可能在以前老的编译环境下用得着。6.0的系统开发环境上是用不着的,源码启动方式发生了改变,google对这个问题进行了修复。
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对这个问题进行了修复。
相关文章推荐
- 关于Android中内存优化的一些方法
- android保存数据到本地 SharedPreferences
- 因为ndk路径错误的android打包报错
- cordova android (一)
- android -解压和压缩zip
- Android工具类系列-ScreenUtil
- Android自定义DataTimePicker(日期选择器)
- 安卓学习笔记—LisetView的下拉刷新
- 给 Android 开发者的 RxJava 详解
- android中控件点击两次才响应onclick方法
- Picasso Android图片第三方框架的使用
- 排名前100的Android开源库
- 在Android环境中使用Valgrind工具进行内存错误检测
- Android CardView 开发过程中要注意的细节
- Android热修复实现
- android 上传文件到服务器代码实例
- android 代码混淆
- Android Binder ProcessState & IPCThreadState相关介绍
- Android下EditText 添加字体下划线
- android开源图表库MPAndroidChart