【问题标题】:startActivityForResult() from a Fragment and finishing child Activity, doesn't call onActivityResult() in Fragment从 Fragment 开始ActivityForResult() 并完成子 Activity,不会在 Fragment 中调用 onActivityResult()
【发布时间】: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()

【问题讨论】:

标签: android android-fragmentactivity


【解决方案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(),这样它就可以正常工作了。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-11-29
                • 2012-11-29
                • 2012-02-08
                • 1970-01-01
                • 2019-07-20
                • 2015-04-14
                • 2017-05-15
                • 1970-01-01
                相关资源
                最近更新 更多