我知道有很多帖子说明当从片段调用startActivityForResult()时,为什么没有在片段中调用onActivityResult();但我的情况有所不同。
我的活动A有一个片段F,它为结果启动一个活动B.该片段在此处收到结果没有问题。问题是当重新启动活动A时,它使用在onResume()期间调用的AsynTask异步构建其整个视图。结果,我的片段F被活动A覆盖。
在我的片段中,我像这样启动Activity:
startActivityForResult(intent, NewElementFragment.CODE_IMAGE_PATH);
所以我想,不用担心,我知道在onActivityResult()之后调用onResume(),所以我需要做的就是在onActivityResult()中确保在onResume()期间不会创建视图。
我创建了一个布尔值,我在onActivityResult()中设置为false,如下所示:
public void onActivityResult(int requestCode, int resultCode, Intent data) {
//put the NewElementFragment back on top
if (requestCode == NewElementFragment.CODE_IMAGE_PATH){
//we set loadinfo to false so that the activity view won't get built
this.loadInfo = false;
Log.d("MainActivity","the loadInfo boolean was set to false");
}
//Do default action on result (nothing) so that the result is passed on the the fragments
super.onActivityResult(requestCode, resultCode, data);
}
但它没有用,因为显然onActivityResult()从未在我的活动A中被触发(尽管正如我之前所说,它在我的片段中被完美触发)。
所以最后我检查了Resume,如果我有一个活动片段,如果是,则中止视图创建,如下所示:
protected void onResume(){
super.onResume();
/*
* We check if there is a fragment built that should be visible. If yes, we don't build the view
*/
NewElementFragment f = (NewElementFragment) getFragmentManager().findFragmentByTag(TAG_NEW_ELEMENT_FRAGMENT);
if (f!=null){
loadInfo = false;
}
//We call the GetProductDetailTask
if (loadInfo) new GetProductDetailTask(pId).execute();
}
它有效,但我觉得很难看。有人能告诉我为什么onActivityResult()永远不会在我的活动A中被调用吗?
或者,如果某人有更好的解决方案,以确保我的活动在重新启动时不会覆盖我的片段?
谢谢。
答案 0 :(得分:0)
您的托管活动必须实现某些界面,您必须从您的片段中调用它。在此Interface实现中,您可以通过startActivityForResult()
调用另一个Activity。在这种情况下,您将在onActivityResult()
处理中取得成功。