来自Fragment和整理子Activity的startActivityForResult(),不会在Fragment中调用onActivityResult()

Mr *_*war 164 android android-fragmentactivity

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
    }
  }
Run Code Online (Sandbox Code Playgroud)

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();
  }
Run Code Online (Sandbox Code Playgroud)

我试过调试代码,但onAcitvityResult()永远不会被调用.

Kev*_*ara 251

你必须写onActivityResult()在你的FirstActivity.Java如下

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
   super.onActivityResult(requestCode, resultCode, data);
}
Run Code Online (Sandbox Code Playgroud)

所以这将调用你的片段 onActivityResult()

编辑:解决方案是替换getActivity().startActivityForResult(i, 1);startActivityForResult(i, 1);

  • 请替换getActivity().startActivityForResult(i,1); with startActivityForResult(i,1); (52认同)
  • 可能是接受的解决方案中的答案实际上并不是什么错误,而*真正的*解决方案是使用`startActivityForResult`而不是`getActivity().start ...`?因为据我所知,你在Activity中用自己的定义覆盖了`onActivityResult`的定义(即这与在答案中的覆盖不存在时的行为完全相同). (14认同)
  • 谢谢@Kevin,我试过你说的但是它不起作用.但我调试了代码,我看到`FirstAcivity.Java`的`onActivityresult()`被调用,`FragmentA.Java`的`onActivityresult()`永远不会被调用.请帮忙. (4认同)

Ami*_*tel 32

凯文的答案有效,但是使用该解决方案很难使用数据.

最佳解决方案是不要从startActivityForResult()活动水平开始.

在你的情况下不要打电话 getActivity().startActivityForResult(i, 1);

相反,只需使用startActivityForResult()它将完美无缺!:)


Rah*_*kar 26

您必须在FirstActivity.Java中编写onActivityResult(),如下所示

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    for (Fragment fragment : getSupportFragmentManager().getFragments()) {
        fragment.onActivityResult(requestCode, resultCode, data);
    }
}
Run Code Online (Sandbox Code Playgroud)

这将在FirstActivity.java上触发片段的onActivityResult方法

  • 谢了哥们 !但是它需要一个26级的API ..因此,在我的情况下,我使用了getSupportFragmentManager()。findFragmentByTag方法,但是您的想法 (2认同)

and*_*per 12

片段已经有了startActivityForResult,onActivityResult如果你使用它会调用片段,而不是getActivity()......


Sha*_*mad 6

最重要的是,这里缺少的都是... FirstActivity的launchMode必须为singleTop。如果是singleInstance,则在调用startActivityForResult方法之后立即调用FragmentA中的onActivityResult。因此,它不会等待在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" />
Run Code Online (Sandbox Code Playgroud)

在FirstActivity.java中,重写onActivityResult方法。因为这将调用FragmentA的onActivityResult。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
}
Run Code Online (Sandbox Code Playgroud)

在FragmentA.Java中,重写onActivityResult方法

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    Log.d("FragmentA.java","onActivityResult called");
}
Run Code Online (Sandbox Code Playgroud)

startActivityForResult(intent, HOMEWORK_POST_ACTIVITY);从FragmentA.Java 调用

finish();SecondActivity.java中的调用方法

希望这会起作用。


小智 5

我们可以startActivityForResult()直接从Fragment 致电,因此您应该致电this.startActivityForResult(i, 1);而不是getActivity().startActivityForResult(i, 1);

Intent i = new Intent(getActivity(), SecondActivity.class);
i.putExtra("helloString", helloString);
this.startActivityForResult(i, 1);
Run Code Online (Sandbox Code Playgroud)

活动会将活动结果发送到您的片段。