Android的Fragment中onActivityResult不被调用的解决方案
2016-05-17 09:57
501 查看
常见的,我们会在FragmentActivity中嵌套一层Fragment使用,甚至Fragment下层层嵌套使用。这个时候,在第二级或者更深级别的Fragment将无法收到onActivityResult回调,查看FragementActivity的源码发现:
publicvoid startActivityFromFragment(Fragmentfragment, Intent intent,
int requestCode) {
if (requestCode == -1) {
super.startActivityForResult(intent, -1);
return;
}
if ((requestCode&0xffff0000) !=
0) {
thrownew IllegalArgumentException("Can only use lower 16 bits
for requestCode");
}
super.startActivityForResult(intent,((fragment.mIndex+1)<<16)
+ (requestCode&0xffff));
}
@Override
protectedvoid 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, "Activityresult fragment index out of range: 0x"
+ Integer.toHexString(requestCode));
return;
}
Fragment frag = mFragments.mActive.get(index);
if (frag ==
null) {
Log.w(TAG, "Activityresult 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,来实现继续分发,如下:
publicclassBaseFragmentActiviyextendsFragmentActivity
{
privatestaticfinal String TAG =
"BaseActivity";
@Override
protectedvoid onActivityResult(int requestCode,
int resultCode, Intent data) {
FragmentManagerfm = 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 outof range: 0x"
+Integer.toHexString(requestCode));
return;
}
Fragment frag =fm.getFragments().get(index);
if (frag ==
null) {
Log.w(TAG, "Activity result no fragment existsfor index: 0x"
+Integer.toHexString(requestCode));
} else {
handleResult(frag,requestCode, resultCode, data);
}
return;
}
}
/**
* 递归调用,对所有子Fragement生效
*
* @param frag
* @param requestCode
* @param resultCode
* @param data
*/
privatevoid 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
*/
privatevoid onClickTextViewRemindAdvancetime() {
Intent intent = new Intent();
intent.setClass(getActivity(), YourActivity.class);
intent.putExtra("TAG","TEST");
getRootFragment().startActivityForResult(intent,
1001);
}
原文地址:http://blog.csdn.net/shuaihj/article/details/46663109
publicvoid startActivityFromFragment(Fragmentfragment, Intent intent,
int requestCode) {
if (requestCode == -1) {
super.startActivityForResult(intent, -1);
return;
}
if ((requestCode&0xffff0000) !=
0) {
thrownew IllegalArgumentException("Can only use lower 16 bits
for requestCode");
}
super.startActivityForResult(intent,((fragment.mIndex+1)<<16)
+ (requestCode&0xffff));
}
@Override
protectedvoid 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, "Activityresult fragment index out of range: 0x"
+ Integer.toHexString(requestCode));
return;
}
Fragment frag = mFragments.mActive.get(index);
if (frag ==
null) {
Log.w(TAG, "Activityresult 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,来实现继续分发,如下:
publicclassBaseFragmentActiviyextendsFragmentActivity
{
privatestaticfinal String TAG =
"BaseActivity";
@Override
protectedvoid onActivityResult(int requestCode,
int resultCode, Intent data) {
FragmentManagerfm = 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 outof range: 0x"
+Integer.toHexString(requestCode));
return;
}
Fragment frag =fm.getFragments().get(index);
if (frag ==
null) {
Log.w(TAG, "Activity result no fragment existsfor index: 0x"
+Integer.toHexString(requestCode));
} else {
handleResult(frag,requestCode, resultCode, data);
}
return;
}
}
/**
* 递归调用,对所有子Fragement生效
*
* @param frag
* @param requestCode
* @param resultCode
* @param data
*/
privatevoid 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
*/
privatevoid onClickTextViewRemindAdvancetime() {
Intent intent = new Intent();
intent.setClass(getActivity(), YourActivity.class);
intent.putExtra("TAG","TEST");
getRootFragment().startActivityForResult(intent,
1001);
}
原文地址:http://blog.csdn.net/shuaihj/article/details/46663109
相关文章推荐
- DCloud H5与Android Native的交互--5+ SDK插件开发
- Android中attr自定义属性详解
- android 广播
- android加固签名工具(源码下载)
- android普通菜单和上下文菜单
- Android 自定义xmlns
- Android Touch事件分发机制
- android IPC通信机制梳理
- 逆向分析 Android 程序- 内存内存
- android 自定义View
- Android 上下文菜单(长摁弹出)
- Android开发中常用的工具类
- android 控件注意点
- android:showAsAction = "never"那么这句话是做什么用的呢
- ubuntu16的android studio无法输入中文的折腾流程
- android 使用LocationClient获取精度,纬度坐标
- android 自定义ProgressBar
- Android开发 如何快速实现分享功能
- 文章标题
- Android百度定位API使用方法