从 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.JavaonActivityresult() 被调用,而FragmentA.JavaonActivityresult() 永远不会被调用。请帮忙。 请替换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()的主要内容,如果未能解决你的问题,请参考以下文章

后按时从 onCreate() 开始片段

如何从 Fragment 启动 Activity?

Kotlin:如何从 Fragment 调用 JobIntentService?

从 ListFragment android 启动另一个 Fragment

从片段开始活动

Fragment