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

9 129

9 ответов:

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

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

так что это будет называть ваш фрагмент onActivityResult()

Edit: решение заключается в замене getActivity().startActivityForResult(i, 1); С startActivityForResult(i, 1);

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

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

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

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

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

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

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

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

самое главное, что все здесь хватает... Режим запуска FirstActivity должен быть синглетным. Если это 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 фрагмента.

@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

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

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

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

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

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

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

вызов ваш onActivityresult() в ParentActivity .