Android的Fragment中onActivityResult不被调用的解决方案(绝对管用)
来源:互联网 发布:mac清理垃圾软件 编辑:程序博客网 时间:2024/05/21 10:47
常见的,我们会在FragmentActivity中嵌套一层Fragment使用,甚至Fragment下层层嵌套使用。这个时候,在第二级或者更深级别的Fragment将无法收到onActivityResult回调,查看FragementActivity的源码发现:
public void startActivityFromFragment(Fragment fragment, Intent intent, : int requestCode) { : if (requestCode == -1) { : super.startActivityForResult(intent, -1); : return; : } : if ((requestCode&0xffff0000) != 0) { : throw new IllegalArgumentException("Can only use lower 16 bits for requestCode"); : } : super.startActivityForResult(intent, ((fragment.mIndex+1)<<16) + (requestCode&0xffff)); : } : @Override : protected void onActivityResult(int requestCode, int resultCode, Intent data) { : mFragments.noteStateNotSaved(); : int index = requestCode>>16; : if (index != 0) { : index--; : if (mFragments.mActive == null || index < 0 || index >= mFragments.mActive.size()) { : Log.w(TAG, "Activity result fragment index out of range: 0x" : + Integer.toHexString(requestCode)); : return; : } : Fragment frag = mFragments.mActive.get(index); : if (frag == null) { : Log.w(TAG, "Activity result no fragment exists for index: 0x" : + Integer.toHexString(requestCode)); : } else { : frag.onActivityResult(requestCode&0xffff, resultCode, data); : } : return; : } : : super.onActivityResult(requestCode, resultCode, data); : } :
原来,程序猿偷懒,没有处理嵌套Fragment的情况,也就是说回调只到第一级Fragment,就没有继续分发。我们可以实现一个自己的FragmentActiviy,来实现继续分发,如下:
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); } } }
然后我们继承这个BaseFragmentActivity即可,但是要注意,在Fragment中启动Activity时,一定要调用根Fragment的启动方法,如下:
/** * 得到根Fragment * * @return */ private Fragment getRootFragment() { Fragment fragment = getParentFragment(); while (fragment.getParentFragment() != null) { fragment = fragment.getParentFragment(); } return fragment; } /** * 启动Activity */ private void onClickTextViewRemindAdvancetime() { Intent intent = new Intent(); intent.setClass(getActivity(), YourActivity.class); intent.putExtra("TAG","TEST"); getRootFragment().startActivityForResult(intent, 1001); }
21 4
- Android的Fragment中onActivityResult不被调用的解决方案(绝对管用)
- Android的Fragment中onActivityResult不被调用的解决方案(绝对管用)
- Android的Fragment中onActivityResult不被调用的解决方案(绝对管用)
- Android的Fragment中onActivityResult不被调用的解决方案(绝对管用)
- Android中Fragment中onActivityResult不被调用的解决方案
- Android的Fragment中onActivityResult不被调用的解决方案
- Android的Fragment中onActivityResult不被调用的解决方案
- Android的Fragment中onActivityResult不被调用的解决方案
- Android的Fragment中onActivityResult不被调用解决方案
- Android的Fragment中onActivityResult不被调用的终极解决方案
- Android的Fragment中onActivityResult不被调用的最终解决方案
- Android的Fragment中onActivityResult不被调用的终极解决方案
- Android中Fragment的onActivityResult不被调用的问题
- android中,fragment onActivityResult不被调用的问题?
- Android在Fragment中不调用onActivityResult()的解决办法
- Fragment中onActivityResult不调用的问题
- Android的onActivityResult不被调用的解决方案
- Android中OnActivityResult()不被Fragment调用的解决办法及源码分析
- 7.12
- 特殊的IP地址详解
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第四章 数据类型和表达式
- Tomcat的配置
- ubuntu12.04 minicom安装和使用
- Android的Fragment中onActivityResult不被调用的解决方案(绝对管用)
- Linux1.0内核中断体系的建立
- IntPtr介绍
- 如何在iOS应用中使用自定义字体
- MySQL存储引擎
- 微信支付流程(IOS)
- 获取html节点时过滤空白节点
- FFMPEG 批量连接视频文件示范代码
- 海量路由表可以使用HASH表存储吗-HASH查找和TRIE树查找