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
2
возможный дубликат onActivityResult не вызывается во фрагменте
QED

Ответы:

271

Вы должны написать 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никогда не дозвонились. Пожалуйста помоги.
г-н Рошан Павар
52
Пожалуйста, замените getActivity (). StartActivityForResult (i, 1); с startActivityForResult (i, 1);
Кевин Адесара
14
Может ли быть так, что ответ в принятом решении на самом деле не то, что здесь не так, и реальное решение - просто использовать startActivityForResultвместо getActivity().start...? Потому что, насколько я вижу, вы переопределяете определение onActivityResultсвоим собственным определением в Деятельности (т.е. это ведет себя точно так же, как если бы переопределение в ответе не существовало).
amnn
@asQuirreL Да. это, вероятно, причина.
Android-разработчик
1
Я делаю то же, что вы объясняете, переопределяете onActivityResult () в действии также во фрагменте с super в обоих и создайте startActivityForResult (intent, i), но не сработало, мне нужна помощь, пожалуйста
Amal Kronz
33

Ответ Кевина работает, но с этим решением сложно играть с данными.

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

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

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

Амит Патель
источник
27

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

Рахул Гирадкар
источник
2
Спасибо друг ! но он требует API уровня 26 .. поэтому в моем случае я использовал метод getSupportFragmentManager (). findFragmentByTag, но с вашей идеей
Дагного Жан-Франсуа
15

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

разработчик Android
источник
7

Самое важное, чего здесь не хватает, так это ... StartMode of 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

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

Г-н Шахбаз Ахмад
источник
Это лучший ответ. Детализация определения "launchMode" в Манифесте имеет жизненно важное значение.
Пабло Инсуа
5

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

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

Активность отправит результат активности на ваш фрагмент.

sanjaymith
источник
1

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

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

Я использовал 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) {

    }
}
аджай сингх
источник
0

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

Дилип Кришнан
источник
-2

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

Нагарадж Вадаканнавар
источник
-6

позвоните onActivityresult()в ParentActivity.

URAndroid
источник
Спасибо за ответ @URAndroid, но получил решение. Ваше решение не идеально. Это не хорошее программирование.
г-н Рошан Павар
Это на самом деле не рекомендуется.
Ло-Тан