Вы должны реализовать 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
где угодно. Однако это не так.
Каждый фрагмент или действие должно обрабатывать результат действия, который они запрашивали. Они не должны обрабатывать результаты других прав. Вы можете сделать это, но это только добавит ненужную сложность вашему коду.