fragment中接纳startActivityForResult的回调难点

Fragment:
在Fragment中调用startActivityForResult,在Activity中是能够拿走到结果,可是需要码是颠三倒四的;

大家都晓得,能够透过动用 startActivityForResult() 和 onActivityResult() 方法来传递或抽出参数。

但您是或不是碰着过onActivityResult()不实施恐怕未按预期的那样实践的图景吗?

此处小编总计了两种意况:

1、实行startActivityForResult,没等到被调用的 Activity
重返,onActivityResult() 就被实践了。
找了非常久,终于通过道听途说得知,这与 Activity
的加载情势(launchMode)有关,该属性能够在 AndroidManifest.xml
中装置。
原本将其设为 singleInstance,经测验,全数必要传递或接收的 Activity
不容许设置该属性,或只可以设为标准格局,否则系统将在startActivityForResult() 后径直调用 onActivityResult()。

Note that this method should only be used with Intent protocols
* that are defined to return a result. In other protocols (such as
* {@link Intent#ACTION_MAIN} or {@link Intent#ACTION_VIEW}), you
may
* not get the result when you expect. For example, if the activity
you
* are launching uses the singleTask launch mode, it will not run in
your
* task and thus you will immediately receive a cancel result.

2、三个activity传递数据和重临数据时,央浼方的onActivityResult始终无响应,通过debug调节和测量检验格局也没见调用该方法。查看了
种种配置和程序代码,均未发掘有荒唐之处。后来留意阅读API表达,茅塞顿开,原本是调用startActivityForResult的参数难点,即调
用时那样:
startActivityForResult(intent,
0);是首个参数的难题,该参数必需大于0本领在重临值并激活onActivityResult方法

本身最先阶是用的二个activity私下认可的常量:RESULT_OK,追踪了代码后意识,该常量的值为-1,当然没办法激活
onActivityResult方法了,随后随意修改为一个大于0的整数,程序即通跑成功。
startActivityForResult(intent, 1); //那样就行了

API描述:
@requestCode If >= 0, this code will be returned in
onActivityResult() when the activity exits.

 3、在TabHost的子Activity中startActivityForResult调用另外Activity时候受到到onActivityResult方法不响应的标题。能够通过调用Activity的getCallingActivity()查看要承受多少的Activity。

API这么解释的:

Return the name of the activity that invoked this activity. This is
* who the data in {@link #setResult setResult()} will be sent to.

举个列子,有几个ActivityA和B,A中推行startActivityForResult(1,new
Intent(A,B.class));

即由A调到B,再B执行setResult后执行getCallingActivity(),显示A。

化解办法如下:

1.透过父Activity运维其他Activity;

2.落到实处父Activity的onActivityResult方法,将该处接收到的呼吁转载给当前运动的子Activity;

3.自定义四个转载接口用来完成第2步中的转载功能;

4.子Activity中实现第3步接口中的方法用来收纳重回新闻;

代码如下:

1.经过父Activity运维别的Activity
1 getParent().startActivityForResult(new Intent(…), REQUEST_CODE); 
2.实现父Activity的onActivityResult方法

3.自定义接口
public interface OnTabActivityResultListener {

public void onTabActivityResult(int requestCode, int resultCode, Intent
data);

}

4.子Activity亟待达成onTabActivityResult方法
@Override

public void onTabActivityResult(int requestCode, int resultCode, Intent
data) {

if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {

//落成该处逻辑
        …

}

}
总括:凡是Activity自个儿含有上次父类的状态都不可能一贯运用startActivityForResult,而要通过getParent(),通过父类调用此办法。

此种情况也适用于多种Fragment嵌套使用的情况。

力排众议上选择FragmentActivity 和
Fragment组合时,在Fragment中调用startActivityForResult方法,实际上是调用Fragment所依付的Activity的startActivityForResult方法。然后Fragment
Activity会先响应本身的onActivityResult方法,再传递到近些日子运动的Fragment中。此时,通过重载Fragment的onActivityResult方法还不错再次来到事件。

这里须要留心,要是重载了FragmentActivity的
onActivityResult方法,必供给调用super.
onActivityResult(),否则Fragment中的 onActivityResult方法不会被调用。 

4、FragmentActivity和Fragment组合使用,且使用多层Fragment组合(即Fragment内部有嵌套)。在底层Fragment中实践startActivityForResult方法后,Fragment的onActivityResult方法未有被调用。

自个儿重载了FragmentActivity的onActivityResult方法,也增添了super.onActivityResult()。通过调治开采,FragmentActivity的onActivityResult方法实践了,可是未有往下传递成功。后来翻看源码:

FragmentActivity中的onActivityResult方法这么写的:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent
data) {
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));
    }
    frag.onActivityResult(requestCode&0xffff, resultCode, data);
    return;
    }

super.onActivityResult(requestCode, resultCode, data);
}

 

FragmentActivity中的onActivityResult方法这么写的:


Fragment在startActivityForResult的时候,使用了Intent.FLAG_ACTIVITY_NEW_TASK,跳转到新的职责栈导致onActivityResult()被实施。

Activity :
在Activity中调用startActivityForResult,那么fragment中的onActivityResult是完全接受不到的

}

public voidonActivityResult(intrequestCode, intresultCode,Intent data) {

先是要知道那些基础知识,接着我们往下走;

自己最开头是用的贰个activity暗中认可的常量:RESULT_OK,追踪了代码后意识,该常量的值为-1,当然没有办法激活
onActivityResult方法了,随后随意修改为贰个大于0的大背头,程序即通跑成功。
startActivityForResult(intent, 1); //那样就行了

}

  1. 若Activity 的加载运行格局(launchMode )是SingleTask或许,会招致onActivityResult()未有调用。修改运行形式为singleTop或然职业。原因是:设置为
    launchmode=”SingleTask”,系统就要 startActivityForResult() 后直接调用
    onActivityResult()。

 3、在TabHost的子Activity中startActivityForResult调用别的Activity时候遭蒙受onActivityResult方法不响应的标题。可以经过调用Activity的getCallingActivity()查看要接受多少的Activity。

2.Fragment依附的Activity中一经重写了onActivityResult()方法,该方法中必需抬高super.onActivityResult(requestCode,
resultCode, data);

要么在Activity中不重写onActivityResult()方法,亲测可用)。Fragment中的onActivityResult()方法中加不加super.onActivityResult(requestCode,
resultCode, data)那句代码对结果未有影响。

PS:若有不准则之处,还请告诉,感谢!479192154批评android基础能力群,迎接您的加盟

举个列子,有三个ActivityA和B,A中实践startActivityForResult(1,new
Intent(A,B.class));

for(Fragment f:fragments){

2.startActivityForResult(intent,
0);这里的第二个参数,约等于央浼码必需大于0,才会激活onActivityResult方法,所以一旦开荒者在支付的时候开掘使用正规,可是就是不调用重回方法,那么此时急需检查下是否伏乞码出标题了;

Return the name of the activity that invoked this activity. This is
* who the data in {@link #setResult setResult()} will be sent to.

@Override

1.Activity中动用startActivityForResult和fragment中动用startActivityForResult是有分别的

2.完毕父Activity的onActivityResult方法,将该处接收到的呼吁转载给当前运动的子Activity;

写在眼下

 转 

3.startActivityForResult()方法刚一调用,还没等activity重临,onActivityResult()方法已经实施完了。

4.有关super难点,以前碰到super在最上端和尾部也会招致出现难点,可是想复现却力不能及复现出这些难点了,等在遇见补充吧.

此种意况也适用于多种Fragment嵌套使用的场合。

super.onActivityResult(requestCode,resultCode,data);

此地必要注意,假如重载了FragmentActivity的
onActivityResult方法,必必要调用super.
onActivityResult(),不然Fragment中的 onActivityResult方法不会被调用。 

化解办法正是把launchMode属性去掉恐怕安装为标准情势

发表评论

电子邮件地址不会被公开。 必填项已用*标注