startActivityForResult () из фрагмента и завершение дочернего действия, не вызывает onActivityResult () во фрагменте

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() мне так и не позвонили.


person Mr Roshan Pawar    schedule 13.06.2013    source источник
comment
Попробуйте поместить его (метод onActivityResult) в класс FirstActivity   -  person viplezer    schedule 13.06.2013
comment
возможный дубликат onActivityResult не вызывается во фрагменте   -  person QED    schedule 15.11.2013


Ответы (10)


Вы должны написать 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);

person Kevin Adesara    schedule 13.06.2013
comment
Спасибо, @Kevin, я попробовал то, что вы сказали, но не работает. Но я отладил код и вижу, что вызывается onActivityresult() из FirstAcivity.Java, а onActivityresult() из FragmentA.Java никогда не вызывается. Пожалуйста помоги. - person Mr Roshan Pawar; 13.06.2013
comment
Замените getActivity (). StartActivityForResult (i, 1); с startActivityForResult (i, 1); - person Kevin Adesara; 13.06.2013
comment
Может быть, ответ в принятом решении на самом деле не в том, что здесь не так, и реальное решение состоит в том, чтобы просто использовать startActivityForResult вместо getActivity().start...? Потому что, насколько я понимаю, вы переопределяете определение onActivityResult его собственным определением в Activity (т.е. это ведет себя точно так же, как если бы переопределение в ответе не существовало). - person amnn; 17.07.2014
comment
@asQuirreL Да. наверное в этом причина. - person android developer; 17.08.2014
comment
@amnn На самом деле, ОБЕИ проблемы. Я уже удалил свой getActivity(), но все еще не получал результата во фрагменте, пока не добавил вызов super в свою активность. - person ashishduh; 04.06.2016
comment
Пока единственное, что вы делаете в процессе, - это вызов метода super, вам даже не нужно его переопределять. Однако ваше решение работает. - person cuddlecheek; 05.01.2017
comment
в моем случае мне пришлось использовать ((Activity) getContext()).startActivityForResult(intent, REQUEST_CODE); - person Saul_programa; 02.07.2018
comment
Я делаю то же, что вы объясняете, переопределяю onActivityResult () в активности также во фрагменте с super в обоих и делаю startActivityForResult (intent, i), но не сработало, мне нужна помощь, пожалуйста - person Amal Kronz; 24.07.2018
comment
Чтобы отметить это, всегда вызывайте super в действии onActivityResult и используйте startActivityForResult фрагмента. Да прибудет с тобой сила. - person ralphgabb; 23.11.2018

Ответ Кевина работает, но это затрудняет работу с данными с помощью этого решения.

Лучшее решение - не начинать startActivityForResult() на уровне активности.

в вашем случае не звоните getActivity().startActivityForResult(i, 1);

Вместо этого просто используйте startActivityForResult(), и он будет работать отлично! :)

person Amit Patel    schedule 13.01.2014

Вы должны написать onActivityResult () в своем FirstActivity.Java следующим образом

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

Это вызовет метод onActivityResult фрагментов на FirstActivity.java.

person Rahul Giradkar    schedule 08.08.2016
comment
Спасибо друг ! но он требует API уровня 26 .. поэтому в моем случае я использовал метод getSupportFragmentManager (). findFragmentByTag, но с вашей идеей - person Dagnogo Jean-François; 25.01.2018

Во фрагменте уже есть startActivityForResult, который вызовет onActivityResult во фрагменте, если вы его используете, вместо _3 _...

person android developer    schedule 23.12.2015

Самая важная вещь, которой здесь не хватает всего ... ЗапускMode для FirstActivity должен быть singleTop. Если это singleInstance, onActivityResult в FragmentA будет вызываться сразу после вызова метода startActivityForResult. Таким образом, он не будет ждать вызова метода finish () в SecondActivity.

Так что пройдите следующие шаги, это определенно сработает, так как после долгих исследований это сработало и у меня.

В файле AndroidManifest.xml сделайте launchMode для FirstActivity.Java значением singleTop.

<activity
        android:name=".FirstActivity"
        android:label="@string/title_activity_main"
        android:launchMode="singleTop"
        android:theme="@style/AppTheme.NoActionBar" />

В FirstActivity.java переопределите метод onActivityResult. Поскольку это вызовет onActivityResult FragmentA.

@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

Надеюсь, это сработает.

person Md Shahbaz Ahmad    schedule 14.10.2017
comment
Это лучший ответ. Детализация определения launchMode в манифесте имеет жизненно важное значение. - person Pablo Insua; 28.05.2018

Мы могли бы вызвать startActivityForResult() прямо из фрагмента, поэтому вы должны вызвать this.startActivityForResult(i, 1); вместо getActivity().startActivityForResult(i, 1);

Intent i = new Intent(getActivity(), SecondActivity.class);
i.putExtra("helloString", helloString);
this.startActivityForResult(i, 1);

Действие отправит результат действия в ваш фрагмент.

person sanjaymith    schedule 17.02.2017

Может, уже поздно для ответа. Но будет полезно для всех.

В моем случае хочу вызвать активность из фрагмента и вернуть обратно из фрагмента.

Я использовал getContext из Fragment Like.

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

    }
}
person ajay singh    schedule 07.10.2019

onActivityResult () из MAinActivity вызовет, onActivityResult () из Fragement не будет вызывать, потому что фрагмент помещен в Activity, поэтому, очевидно, он возвращается в MainActivity

person dileep krishnan    schedule 02.02.2018

просто попробуйте это:

//don't call getActivity()
getActivity().startActivityForResult(intent, REQ_CODE);

//just call 
startActivityForResult(intent, REQ_CODE);
//directly from fragment

person White Clover    schedule 11.01.2021

Не вызывайте finish() в методе onCreate(), тогда он работает нормально.

person Nagaraj Wadakannavar    schedule 21.09.2017