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

时间:2013-06-13 11:16:15

标签: 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
    }
  }

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()永远不会被调用。

11 个答案:

答案 0 :(得分:235)

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

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
   super.onActivityResult(requestCode, resultCode, data);
}

因此,这将调用您的片段onActivityResult()

修改:解决方案是将getActivity().startActivityForResult(i, 1);替换为startActivityForResult(i, 1);

答案 1 :(得分:31)

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

最佳解决方案是不要在活动级别启动startActivityForResult()

在您的情况下不要致电getActivity().startActivityForResult(i, 1);

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

答案 2 :(得分:21)

您必须在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方法

答案 3 :(得分:12)

该片段已有startActivityForResult,如果您使用该片段,则会在片段中调用onActivityResult,而不是getActivity() ...

答案 4 :(得分:4)

我们可以直接从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);

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

答案 5 :(得分:4)

最重要的是,这里缺少的是...... 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" />

在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();方法

希望这会奏效。

答案 6 :(得分:1)

答案迟到了。但是对任何人都会有帮助。

在我的情况下,要从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) {

    }
}

答案 7 :(得分:0)

mainActivity的onActivityResult()会调用,Fragement的onActivityResult()不会调用因为片段放在Activity中所以很明显它会回到MainActivity

答案 8 :(得分:0)

试试这个:

Dataframes

答案 9 :(得分:-2)

请勿在{{1​​}}方法中调用finish(),然后才能正常工作。

答案 10 :(得分:-4)

在ParentActivity中调用onActivityresult()