Fragment中调用startActivityForResult问题
2017-10-09 20:49
507 查看
在使用support v4中的Fragment时,如果我们需要调用startActivityForResult方法来与跳转的Activity进行通信时,如果希望Fragment的onActivityResult方法能够被响应,我们就必须调用Fragment的startActivityForResult方法,而不是调用:getActivity().startActivityForResult()
后者调用的是Fragment的宿主Activity,即FragmentActivity的startActivityForResult方法。
两者的区别如下:
Fragment中的startActivityForResult方法如下:
public void startActivityForResult(Intent intent, int requestCode) {
if (mActivity == null) {
throw new IllegalStateException("Fragment " + this + " not attached to Activity");
}
mActivity.startActivityFromFragment(this, intent, requestCode);
}
调用了FragmentActivity中的startActivityFromFragment方法:
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));
}
可以看到,该方法把Fragment的index值存在了requestCode的高16位,然后调用了startActivityForResult方法。
接下来我们来看看消息的返回处理,FragmentActivity中的onActivityResult方法:
/**
* Dispatch incoming result to the correct fragment.
*/
@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);
}
这里把requestCode的高16位(即Fragment的index值)取了出来,并通过index找到对应的Fragment,然后调用Fragment的onActivityResult来分发消息。
因此,如果直接调用Fragment的宿主FragmentActivity的startActivityForResult方法,requestCode中就不会存入Fragment的index值,在onActivityResult处理消息时也会找不到相应的Fragment进行进一步的消息分发。
后者调用的是Fragment的宿主Activity,即FragmentActivity的startActivityForResult方法。
两者的区别如下:
Fragment中的startActivityForResult方法如下:
public void startActivityForResult(Intent intent, int requestCode) {
if (mActivity == null) {
throw new IllegalStateException("Fragment " + this + " not attached to Activity");
}
mActivity.startActivityFromFragment(this, intent, requestCode);
}
调用了FragmentActivity中的startActivityFromFragment方法:
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));
}
可以看到,该方法把Fragment的index值存在了requestCode的高16位,然后调用了startActivityForResult方法。
接下来我们来看看消息的返回处理,FragmentActivity中的onActivityResult方法:
/**
* Dispatch incoming result to the correct fragment.
*/
@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);
}
这里把requestCode的高16位(即Fragment的index值)取了出来,并通过index找到对应的Fragment,然后调用Fragment的onActivityResult来分发消息。
因此,如果直接调用Fragment的宿主FragmentActivity的startActivityForResult方法,requestCode中就不会存入Fragment的index值,在onActivityResult处理消息时也会找不到相应的Fragment进行进一步的消息分发。
相关文章推荐
- fragment 调用startActivityForResult 问题
- fragment调用startActivityforResult的回调问题
- 解决Android中Fragment(SherlockFragment)调用startActivityForResult返回requestCode错误的问题
- Fragment调用startActivityForResult问题
- 解决Android中Fragment调用startactivityforresult不能返回结果的问题
- android小知识之fragment中调用startActivityForResult(Intent intent,int requestcode)所遇到的问题
- 调用startActivityForResult,onActivityResult无响应的问题
- 总结:调用startActivityForResult,onActivityResult无响应的问题
- Fragment中调用startActivityForResult()返回值的实现
- 调用startActivityForResult,onActivityResult无响应的问题
- 总结:调用startActivityForResult,onActivityResult无响应的问题
- 调用startActivityForResult后,onActivityResult立刻响应,返回当前页onActivityResult不响应的问题
- 【Android】startActivityForResult调用问题总结
- 关于fragment里面调用startActivityForResult,onActivityResult没有反应的学习
- 调用startactivityforresult后,onactivityresult立刻响应问题
- 关于Activity和Fragment同时使用startActivityForResult的问题
- 在Viewpager的子Activity中startActivityForResult调用其他Activity时候遭遇到onActivityResult方法不响应的问题.
- 调用startActivityForResult,onActivityResult无响应的问题
- Fragment与Activity之间的通讯(解决Android中Fragment调用startactivityforresult不能返)
- 调用startActivityForResult,onActivityResult无响应的问题