Android Fragment 中的 startActivityForResult() 与 getActivity().startActivityForResult()

Posted

技术标签:

【中文标题】Android Fragment 中的 startActivityForResult() 与 getActivity().startActivityForResult()【英文标题】:startActivityForResult() vs getActivity().startActivityForResult() in Android Fragment 【发布时间】:2018-05-28 04:43:32 【问题描述】:

android Fragment 中的startActivityForResult()getActivity().startActivityForResult() 有什么区别?在 Fragment 中调用 onActivityForResult() 时的行为差异是什么?

【问题讨论】:

developer.android.com/reference/android/app/…, int, android.content.Intent) 和developer.android.com/training/basics/intents/result.html 不知道有Android开发的文档吗? 【参考方案1】:

startActivityForResult() 必须从fragmentonActivityForResult() 处理它

getActivity().startActivityForResult() 必须从activityonActivityForResult() 处理它

基本上:

如果您在fragment 上并且想要处理fragment 上的结果,请使用onActivityForResult(),否则如果您想从片段的activity 处理它,请使用getActivity.startActivityForResult()

【讨论】:

【参考方案2】:

startActivityForResult 来自其容器 Activity 的片段调用 startActivityForResult。 所以对于片段:-

从包含片段的 Activity 调用 startActivityForResult(Intent, int)。

而当您直接在片段中使用它时,可以对请求代码进行某些更改。您将在 onActivityresult() 中获得修改后的请求代码,因为我最近遇到了修改请求代码的问题。您可以查看This Thread。

【讨论】:

【参考方案3】:

我们可以在 Activity 中使用 startActivityForResult(),在 Fragment 中使用 getActivity().startActivityForResult()

简而言之,为了获得 Activity 的上下文,我们在它前面加上 getActiviy()

相反,我们可以从 Activity 中调用特定 Fragment 的 onActivityResult(),如下所示:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) 
    for (Fragment fragment : getChildFragmentManager().getFragments()) 
        fragment.onActivityResult(requestCode, resultCode, data);
    

如果我们把它说得更详细,那么,

如果您从 Fragment 调用 startActivityForResult(),则 requestCode 将由拥有该 Fragment 的 Activity 更改。

所以,如果你想在你的活动中得到正确的结果代码,你可以尝试如下:

请勿使用:(在这种情况下):

startActivityForResult(intent, 1);

使用:

getActivity().startActivityForResult(intent, 1);

希望对您有所帮助..!

【讨论】:

实际上我在片段中使用了startActivityForResult(),而没有使用getActivity()。这就是我问行为差异的原因。 见@j.elmer 没有这样的区别。但是,有点不同的是我们只能在片段中使用 getActivity().startActivityForResult() 来获取 Activity 的上下文。 Fragment 中单独的startActivityForResult 方法的全部意义在于避免遍历Activity 的onActivityResult 中的所有Fragment。这是完全错误的做法。 遍历所有片段的 ??你能解释一下吗?【参考方案4】:

完全没有区别... 但有点不同的是 getActivity().startActivityForResult() 只能从片段调用:)

【讨论】:

【参考方案5】:

"startActivityForResult()" 适用于 Activity 类。 当你在 Activity 类时,你可以直接使用这个方法。 当你在fragment中时,因为fragment是在Activity上创建的,你应该首先获取基于它的fragment的activity。意思是:

//in fragment class:
Activity activity = this.getActivity();

现在你有了活动,我说过,你可以对从片段获得的活动使用“startActivityForResult()”。

activity.startActivityForResult();

希望有所帮助。

【讨论】:

【参考方案6】:

您必须参考Activity 进行调用,因为startActivityForResult(Intent intent, int requestCode)Activity 中指定的方法。

所以,如果您从YourActivity 调用,它已经有Activity 的引用,例如:

YourActivity extends AppCompatActivity (which is subclass of `Activity`)

但是如果你是从YourFragment 调用它,你需要指定Activity 引用,在这种情况下它将是包含YourFragment 的Activity;因此我们使用getActivity()然后触发startActivityForResult()

【讨论】:

以上是关于Android Fragment 中的 startActivityForResult() 与 getActivity().startActivityForResult()的主要内容,如果未能解决你的问题,请参考以下文章

Android 怎么将fragment 动态地添加到布局中的任意位置?

android fragment 怎样调用activity中的方法

Android Fragment使用 Toolbar使用及Fragment中的Toolbar处理

Android的Fragment中的互相通信-桥梁activity

Fragment 中的 ArrayAdapter - Android

android activity中的变量怎么传值给fragment