从 Fragment 开始ActivityForResult() 并完成子 Activity,不会在 Fragment 中调用 onActivityResult()
Posted
技术标签:
【中文标题】从 Fragment 开始ActivityForResult() 并完成子 Activity,不会在 Fragment 中调用 onActivityResult()【英文标题】:startActivityForResult() from a Fragment and finishing child Activity, doesn't call onActivityResult() in Fragment 【发布时间】:2013-06-09 18:13:46 【问题描述】:FirstActivity.Java
有一个FragmentA.Java
,它调用startActivityForResult()
。
SecondActivity.Java
打电话给finish()
但onActivityResult
永远不会被调用
写在FragmentA.Java
。
FragmentA.Java
代码:
@Override
public void onActivityCreated(Bundle savedInstanceState)
super.onActivityCreated(savedInstanceState);
// some code
Intent i = new Intent(getActivity(), SecondActivity.class);
i.putExtra("helloString", helloString);
getActivity().startActivityForResult(i, 1);
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
super.onActivityResult(requestCode, resultCode, data);
getActivity();
if(requestCode == 1 && resultCode == Activity.RESULT_OK)
//some code
SecondActivity.Java
代码:
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
//some code
Intent returnIntent = new Intent();
returnIntent.putExtra("result", result);
setResult(Activity.RESULT_OK,returnIntent);
finish();
我已尝试调试代码,但从未调用过 onAcitvityResult()
。
【问题讨论】:
尝试把它(onActivityResult方法)放到FirstActivity类中 onActivityResult not being called in Fragment 的可能重复项 【参考方案1】:您必须在您的FirstActivity.Java
中写入onActivityResult()
,如下所示
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
super.onActivityResult(requestCode, resultCode, data);
所以这将调用您片段的onActivityResult()
编辑:解决方案是将getActivity().startActivityForResult(i, 1);
替换为startActivityForResult(i, 1);
【讨论】:
谢谢@Kevin,我试过你说的,但没有用。但是我调试了代码,我看到FirstAcivity.Java
的onActivityresult()
被调用,而FragmentA.Java
的onActivityresult()
永远不会被调用。请帮忙。
请替换getActivity().startActivityForResult(i, 1); with startActivityForResult(i, 1);
会不会是接受的解决方案中的答案其实并不是这里出了什么问题,而真正的解决方案是只使用startActivityForResult
而不是getActivity().start...
?因为据我所知,您在 Activity 中用自己的定义覆盖了 onActivityResult
的定义(即,这与答案中的覆盖不存在完全相同)。
@asQuirreL 是的。这可能是原因。
我和你解释的一样,在活动中覆盖 onActivityResult() 也在片段中用超级在两者中并创建 startActivityForResult (intent ,i),但没有工作,我需要帮助【参考方案2】:
Kevin 的回答有效,但使用该解决方案很难处理数据。
最好的解决方案是不要在活动级别上启动startActivityForResult()
。
在你的情况下不要打电话给getActivity().startActivityForResult(i, 1);
相反,只需使用startActivityForResult()
就可以了! :)
【讨论】:
【参考方案3】:您必须在 FirstActivity.Java 中编写 onActivityResult(),如下所示
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
for (Fragment fragment : getSupportFragmentManager().getFragments())
fragment.onActivityResult(requestCode, resultCode, data);
这将触发FirstActivity.java上片段的onActivityResult方法
【讨论】:
谢谢队友!但它需要一个 26 级 API .. 所以在我的情况下,我使用 getSupportFragmentManager().findFragmentByTag 方法,但你的想法【参考方案4】:片段已经有startActivityForResult
,如果你使用它会在片段中调用onActivityResult
,而不是getActivity()
...
【讨论】:
【参考方案5】:最重要的是,这里缺少的是... FirstActivity 的launchMode 必须是singleTop。如果是singleInstance,FragmentA中的onActivityResult会在调用startActivityForResult方法之后被调用。所以,它不会等待调用 SecondActivity 中的 finish() 方法。
所以请执行以下步骤,经过长时间的研究,它肯定会像我一样工作。
在androidManifest.xml文件中,将FirstActivity.Java的launchMode设为singleTop。
<activity
android:name=".FirstActivity"
android:label="@string/title_activity_main"
android:launchMode="singleTop"
android:theme="@style/AppTheme.NoActionBar" />
在 FirstActivity.java 中,重写 onActivityResult 方法。因为这会调用 FragmentA 的 onActivityResult。
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
super.onActivityResult(requestCode, resultCode, data);
在 FragmentA.Java 中,重写 onActivityResult 方法
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
Log.d("FragmentA.java","onActivityResult called");
从 FragmentA.Java 调用 startActivityForResult(intent, HOMEWORK_POST_ACTIVITY);
在 SecondActivity.java 中调用 finish();
方法
希望这会奏效。
【讨论】:
这是最好的答案。在 Manifest 中定义“launchMode”的细节至关重要。【参考方案6】:我们可以直接从 Fragment 调用 startActivityForResult()
所以你应该打电话给this.startActivityForResult(i, 1);
而不是getActivity().startActivityForResult(i, 1);
Intent i = new Intent(getActivity(), SecondActivity.class);
i.putExtra("helloString", helloString);
this.startActivityForResult(i, 1);
Activity 会将 Activity Result 发送到您的 Fragment。
【讨论】:
【参考方案7】:可能答案已经晚了。但对任何人都有帮助。
在我的情况下,想从 Fragment 调用活动并从 Fragment 返回 setResult。
我使用了Fragment Like的getContext。
startActivityForResult(new Intent(getContext(), NextActivity.class), 111);
并从片段中设置结果
getActivity().setResult(Activity.RESULT_OK);
getActivity().finish();
现在将结果片段化
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK && requestCode == 111)
【讨论】:
【参考方案8】:MAinActivity 的 onActivityResult() 会调用,Fragment 的 onActivityResult() 不会调用,因为 Fragment 放在 Activity 中,所以很明显它会回到 MainActivity
【讨论】:
【参考方案9】:试试这个:
//don't call getActivity()
getActivity().startActivityForResult(intent, REQ_CODE);
//just call
startActivityForResult(intent, REQ_CODE);
//directly from fragment
【讨论】:
【参考方案10】:不要在onCreate()
方法中调用finish()
,这样它就可以正常工作了。
【讨论】:
以上是关于从 Fragment 开始ActivityForResult() 并完成子 Activity,不会在 Fragment 中调用 onActivityResult()的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin:如何从 Fragment 调用 JobIntentService?