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

Відповіді:


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 Так. це, мабуть, причина.
андроїд розробник

1
Я роблю те саме, що ви пояснюєте, переосмислюйте onActivityResult () в активності також у фрагменті з супер в обох і роблю startActivityForResult (наміри, я), але не вийшло, мені потрібна допомога, будь ласка
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, але з вашою ідеєю
Dagnogo Jean-François

15

У фрагмента вже є startActivityForResult, який би викликав onActivityResultфрагмент, якщо ви використовуєте його, а не getActivity()...


7

Найголовніше, що тут все пропущено, це ... Запуск модуля FirstActivity повинен бути singleTop. Якщо це поодинці, інстанція onActivityResult у FragmentA буде викликана відразу після виклику методу startActivityForResult. Отже, він не чекатиме виклику методу закінчення () у SecondActivity.

Тому пройдіть наступні кроки. Це, безумовно, спрацює так, як працювало і для мене після довгого дослідження.

У файлі AndroidManifest.xml зробіть startMode від 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

Сподіваюся, це спрацює.


Це найкраща відповідь. Подробиця визначення "startMode" в Manifest є життєво важливою.
Пабло Інсуа

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

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


1

Нехай вже пізно для відповіді. Але буде корисно для будь-кого.

У моєму випадку потрібно зателефонувати на активність з Fragment та 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 () від Fragment не буде викликати, оскільки фрагмент розміщений у Activity, тому очевидно повертається до MainActivity



-6

зателефонуйте onActivityresult()в ParentActivity.


Дякуємо за відповідь @URAndroid, але отримали рішення. Ваше рішення не є ідеальним. Це не добре програмування.
Містер Рошан Павар

Це насправді не рекомендується.
Ло-Тан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.