从 Fragment 调用 startActivityForResult 不会调用 onActivityResult

Posted

技术标签:

【中文标题】从 Fragment 调用 startActivityForResult 不会调用 onActivityResult【英文标题】:Call startActivityForResult from Fragment doesn't call onActivityResult 【发布时间】:2012-11-29 07:13:23 【问题描述】:

我有一个从 Fragment 调用的 DialogActivity,用于显示带有两个图像按钮的自定义 Dialog

DialogActivity.onCreate

final Dialog dialog = new Dialog(this, R.style.DialogTheme);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.dialog_pause); 
dialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
dialog.show();

DialogActivity.onClick

        @Override
        public void onClick(View v) 
            Log.d(LOGTAG, "onClick CONTINUE");

            Intent resultData = new Intent();
            resultData.putExtra("TEST", "return data");
            setResult(666, resultData);
            dialog.cancel();
        

在调用startActivityForResult的片段中:

Intent dialogActivityIntent = new Intent(getActivity(), DialogActivity.class);
startActivityForResult(dialogActivityIntent, 999);

在调用startActivityForResultActivityFragment中:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) 

    super.onActivityResult(requestCode, resultCode, data);

当我单击按钮时,我只会取消对话框并显示后台活动(片段)。

FragmentActivity 中没有任何对onActivityResultonResume、...的调用包含Fragment

我尝试过的事情:

在包含我的FragmentFragmentActivity 中实现onActivityResult

须知:

我在每个Activity 中设置了属性noHistory=true

如果我在onClick 中执行finish(),则调用DialogActivityActivity/Fragment 也将关闭,并且应用程序返回到之前的Activity

这可能是问题所在,我不调用finish() ...但是如果我调用finish(),它会退出到另一个Activity,而不是调用ActivityActivity

我检查的链接:

startActivityForResult() dont call to onActivityResult(int requestCode, int resultCode, Intent data)?

Cannot get to trigger onActivityResult() android?

startActivityForResult doesn't seem to call onActivityResult

onActivityResult never called

Android onActivityResult NEVER called

onActivityResult() not called when Activity started from Fragment


我希望一切都解释清楚^^。

提前致谢。

【问题讨论】:

尝试getActivity().startActivityForResult(dialogActivityIntent, 999); 并在托管FragmentActivity 中捕获结果 我已经尝试过了,代码是在发布我的问题前一分钟。谢谢 :( 你想要得到结果的Activity 是否在清单文件中将android:launchMode 指定为singleInstancesingleTask 看到这个链接可能对你有帮助:androidtutorialonline.com/onactivityresult-in-fragment 【参考方案1】:

具有noHistory=true 属性的活动在通过startActivityForResult() 启动新的Activity 时将永远不会调用其onActivityResult()。正如documentation 所述,当noHistory 属性设置为true 时,当用户离开Activity 时,finish() 会在Activity 上调用。

所以,当startActivityForResult() 被调用时,Activity 被导航离开,导致其finish() 被调用并使其永远不会收到对onActivityResult() 的调用。如果您从调用startActivityForResult()Activity 中删除noHistory=true 属性,然后在您的DialogActivityonClick() 中调用finish(),那么您仍然应该看到启动它的Activity接听电话到onActivityResult()

【讨论】:

对不起,迟到的评论...几天后,我按照您所说的解决了这个问题。谢谢! 太棒了@ashu ..它首先解决了我的两个问题 【参考方案2】:

完成结果后关闭所有活动。 例如,在您覆盖的 onActivityResult 中,您可以添加 finishActivity(活动 1..N)。不要忘记将每个都放在 try catch 之下。

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。 这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review

以上是关于从 Fragment 调用 startActivityForResult 不会调用 onActivityResult的主要内容,如果未能解决你的问题,请参考以下文章

从Fragment调用startActivityForResult不会调用onActivityResult

从 Fragment 开始ActivityForResult() 并完成子 Activity,不会在 Fragment 中调用 onActivityResult()

Kotlin:如何从 Fragment 调用 JobIntentService?

从 Fragment 类调用 Web 服务(API)的正确方法

Android:从 viewPager 中的 Fragment 为 ListView 的适配器调用 getview()

从后台弹出时不调用 Fragment 的 onResume()