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() никогда не вызывается.

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

Фрагмент уже имеет startActivityForResult, который будет вызывать onActivityResult в фрагменте, если вы используете его, вместо getActivity()...

Ответ 5

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

Итак, выполните следующие шаги. Это определенно будет работать, поскольку это сработало для меня тоже после долгого исследования.

В файле AndroidManifest.xml make 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 of 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

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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

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

Я использовал getContext из фрагмента 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) {

    }
}

Ответ 9

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

Ответ 10

вызовите onActivityresult() в ParentActivity.