Если я запускаю действие для результата из фрагмента, должен ли я вызывать результат действия для фрагмента или действия? - PullRequest
0 голосов
/ 16 мая 2019

Я не уверен, что будет правильным путем.У меня есть несколько призывов к действию для различных фрагментов.Должен ли каждый фрагмент иметь свой onActivityResult?Или все это должно быть ручками в onActivityResult действия?

Ответы [ 3 ]

1 голос
/ 16 мая 2019

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

1 голос
/ 16 мая 2019

Вот три ситуации

  • Запуск активности из фрагмента без использования контекста активности

    enter image description here

    • Начать занятие с занятия

enter image description here

  • Начать действие из вложенного фрагмента

    Что за вложенный фрагмент?

    A fragment embed into another fragment

    Почему вложенный фрагмент не может получить onActivityResult() обратный вызов?

    Проверьте эту ссылку

    Как вручную вызвать onActivityResult() для вложенного фрагмента

    Проверьте эту ссылку

enter image description here

1 голос
/ 16 мая 2019

Вы должны реализовать onActityResult для каждого Fragment, который запустил действие через startActivityForResult. Таким образом, каждый фрагмент может правильно отслеживать результат: результат действия имеет смысл только для фрагмента, который его запросил.

Есть и причина для этого.

Когда вы запускаете действие, вы должны установить код запроса:

// Note the request code: 0
startActivityForResult(0, new Intent(...))

Однако, если вы вызываете этот метод из Fragment, Android внутренне изменит код запроса (чтобы он мог автоматически отслеживать фрагмент, который вызвал запрос). Это происходит потому, что хост Fragment является FragmentActivity, а не простым Activity

// From FragmentActivity
// Note how the request Code is overriden ((requestIndex + 1) << 16) + (requestCode & 0xffff)
startActivityFromFragment(...) {
    startActivityForResult(this, intent, ((requestIndex + 1) << 16) + (requestCode & 0xffff), options);
}

Итак, когда срабатывает onActivityResult, вы можете зафиксировать результат на хосте. Однако в действии хоста requestCode больше не тот, который вы отправили, а requestCode, измененный внутри Android:

In host activity:
@Override
protected void onActivityResult(final int requestCode, final int resultCode,
                                @Nullable final Intent data) {
    // This print 65536
    Log.v("TEST", "onActivityResult: " + requestCode);
    super.onActivityResult(requestCode, resultCode, data);
}

Как видите, вы можете зафиксировать результат активности на хосте. Однако код запроса уже не тот, который вы установили (0). Итак, здесь вы не можете отслеживать код запроса. Таким образом, вы не можете отследить, от кого этот результат.

Android вызовет onActivityResult в вашем фрагменте. Однако перед вызовом фрагмента код запроса преобразуется обратно в отправленное вами значение (0):

// From FragmentActivity
// Note how the request Code is converted back to 0
onActivityResult(....) {
    // Android will call your fragment with the correct requestCode
    targetFragment.onActivityResult(requestCode & 0xffff, resultCode, data);
}

//In your fragment:
@Override
protected void onActivityResult(final int requestCode, final int resultCode,
                                @Nullable final Intent data) {
    // This print 0. So, now, you know this is the result of the request 0
    Log.v("TEST", "onActivityResult: " + requestCode);
}

Итак, есть также причина для реализации onActivityResult в вашем фрагменте. Особенно, если у вас есть разные фрагменты, запускающие разные действия и т. Д. Если вы всегда начинаете одно и то же действие, вы можете ошибочно полагать, что можете реализовать onActityResult где угодно. Однако это не так. Каждый фрагмент или действие должно обрабатывать результат действия, который они запрашивали. Они не должны обрабатывать результаты других прав. Вы можете сделать это, но это только добавит ненужную сложность вашему коду.

...