在Android Fragment中,startActivityForResult()和getActivity().startActivityForResult()有什么区别?

8

startActivityForResult()getActivity().startActivityForResult()在Android Fragment中有什么区别?当在Fragment中调用onActivityForResult()时,行为上有什么不同?


https://developer.android.com/reference/android/app/Activity.html#onActivityResult(int, int, android.content.Intent) 和 https://developer.android.com/training/basics/intents/result.html - IntelliJ Amiya
你不知道有Android开发文档吗? - I am the Most Stupid Person
6个回答

4

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

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

基本上:

如果在fragment上处理结果,则使用onActivityForResult(),否则如果您想要从fragmentactivity中处理它,则使用getActivity.startActivityForResult()


2
从片段调用的startActivityForResult方法需要调用其容器Activity的startActivityForResult方法。
因此在片段中,应该从包含它的Activity中调用startActivityForResult(Intent, int)。
如果直接在片段中使用它,则可以对请求代码进行一些修改。你将在onActivityResult()中获得修改后的请求代码,因为我最近遇到了一些修改后请求代码的问题。你可以参考这个线程:This Thread。请注意保留html标签。

1
我们可以在Activity中使用startActivityForResult(),在Fragment中使用getActivity().startActivityForResult()
简而言之,为了获取Activity的Context,我们在其前面加上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更改。
因此,如果您想在活动中获取正确的resultCode,则可以尝试以下方法: 不要使用以下方法:(在这种情况下):
startActivityForResult(intent, 1);

使用:
getActivity().startActivityForResult(intent, 1);

希望它有所帮助..!

实际上我在片段中使用了startActivityForResult(),而没有使用getActivity()。这就是为什么我要问行为差异的原因。 - j.elmer
1
请看@j.elmer,它们之间没有什么区别。但是,稍微有点不同的是我们只能在片段中使用getActivity().startActivityForResult()以获取活动的上下文。 - Mashuk Khan
Fragment 中单独使用 startActivityForResult 方法的整个目的是避免需要在 Activity 的 onActivityResult 中遍历所有 Fragment。这正是错误的做法。 - ianhanniballake
遍历所有片段?你能否再详细解释一下? - Mashuk Khan

0

完全没有区别... 但是稍微有一点不同的是 getActivity().startActivityForResult() 只能从 Fragment 中调用 :)


0

你需要使用关于Activity的引用来进行调用,因为startActivityForResult(Intent intent, int requestCode)是在Activity中指定的方法。

因此,如果你从YourActivity中调用,它已经有了一个如下的Activity引用:

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

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


0

"startActivityForResult()" 只能在 Activity 类中使用。 当你在 Activity 类中时,可以直接使用此方法。 当你在 Fragment 中时,因为 Fragment 是依附于 Activity 创建的,所以你需要先获取 Fragment 所依附的 Activity。具体做法如下:

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

现在你已经拥有了活动并且我说过,你可以在从片段获取的活动上使用“startActivityForResult()”。

activity.startActivityForResult();

希望能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接