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()
必须从fragment
的onActivityForResult()
处理它
getActivity().startActivityForResult()
必须从activity
的onActivityForResult()
处理它
基本上:
如果您在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