片段中的startActivityForResult()并完成子活动,但在片段中未调用onActivityResult()


172

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()未被调用。


1
尝试将其(onActivityResult方法)放在FirstActivity类中
viplezer 2013年

Answers:


270

你必须写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);


4
谢谢@Kevin,我尝试了您说的内容,但是没有用。但我调试的代码,我看到onActivityresult()FirstAcivity.Java被称为和onActivityresult()FragmentA.Java永远不会被调用。请帮忙。
Roshan Pawar先生2013年

52
请替换getActivity()。startActivityForResult(i,1); 与startActivityForResult(i,1);
凯文·阿德萨拉

14
可能是接受的解决方案中的答案实际上不是这里出什么问题,而真正的解决方案是仅使用startActivityForResult而不是getActivity().start...?因为据我所知,您正在onActivityResultActivity 中使用其自己的定义覆盖的定义(即,其行为与答案中的覆盖不存在的行为完全相同)。
amnn 2014年

@asQuirreL是的。这可能是原因。
android开发人员

1
我做的方法与您解释的相同,在活动中的片段中也都覆盖了super的onActivityResult(),并使startActivityForResult(intent,i)无效,但没有用,请帮忙
Amal Kronz

33

凯文(Kevin)的答案行得通,但使用该解决方案很难处理数据。

最好的解决方案不是从startActivityForResult()活动级别开始。

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

相反,只需使用startActivityForResult()它就可以正常工作!:)


27

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


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

15

该片段已经具有startActivityForResultonActivityResult如果您使用它,它将调用该片段,而不是getActivity()...


7

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

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

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

希望这会起作用。


这是最好的答案。在清单中定义“ launchMode”的细节至关重要。
巴勃罗因苏阿

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);

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


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) {

    }
}

0

MAinActivity的onActivityResult()将调用,而Fragement的onActivityResult()将不会调用,因为片段被放置在Activity中,因此很明显它返回到MainActivity



-6

onActivityresult()在ParentActivity中致电您。


感谢您回答@URAndroid,但已找到解决方案。您的解决方案并不完美。这不是很好的编程。
Roshan Pawar先生2013年

实际上建议这样做。
Lo-Tan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.