Как лучше всего передать сообщение от одного фрагмента его родителю (эквивалент onActivityResult) - PullRequest
3 голосов
/ 13 мая 2011

Хорошо, я знаю, что могу думать об этом неправильно, но ...

A) У меня есть активность A Фрагмент загрузки F1, который загружает фрагмент F2. F2 выполняет действие, которое должно привести к его закрытию, а затем F1 выполняет определенное действие в зависимости от того, как оно было закрыто.

B) Теперь, поскольку я также поддерживаю одну панель, не фрагментную, версия F1 также косвенно загружает F2 через вызов startActivityForResult. Это означает, что когда действие оболочки F2 завершено, F1 получает вызов onActivityResult, и F1 может делать то, что ему нужно.

Однако я изо всех сил пытаюсь найти лучший способ реализовать то, что я хочу (A). У меня есть F2, перезванивающая к действию A, чтобы вытолкнуть его из стека. Должен ли я тогда посмотреть на передачу сообщения F1, чтобы сделать то, что ему нужно сделать? В качестве альтернативы (я полагаю, F1 может быть ответственным за выталкивание F2 из стека).

Что меня интересует, так это то, нахожусь ли я на правильном пути в отношении передачи сообщений назад и вперед через родительское действие, или есть более прямой способ, когда F1 отвечает на то, что F2 выполняет что-то, что требует его закрытия, и F1 делай то, что нужно.

Заранее спасибо. Питер.

Ответы [ 2 ]

7 голосов
/ 14 мая 2011

Если ваши фрагменты тесно связаны между собой, просто не запускайте их в отдельных действиях.Для случая с одной панелью вы можете просто переключать фрагменты в пределах одного действия.

В противном случае, если вы хотите разделить их между действиями, вам нужно использовать модель onActivityResult() для распространения результатов обратно и в двойном-pane case "эмулирует" его, просто имея второй вызов onActivityResult() первого фрагмента.Обратите внимание, что Fragment.setTargetFragment() включает аргумент кода запроса для облегчения этого.

7 голосов
/ 13 мая 2011

У меня есть активность A Фрагмент загрузки F1, который загружает фрагмент F2

ИМХО, фрагменты не должны загружать другие фрагменты. Действия загружают фрагменты, основываясь на доступном пространстве экрана. Фрагменты не должны ни знать, ни заботиться о том, существует ли какой-либо другой фрагмент в текущем действии или другие фрагменты присутствуют в других действиях.

У меня есть F2, перезванивающая к действию A, чтобы вытолкнуть его из стека. Должен ли я тогда смотреть на передачу сообщения F1, чтобы сделать то, что ему нужно сделать?

Да.

Что меня интересует, так это то, нахожусь ли я на правильном пути в отношении передачи сообщений назад и вперед через родительское действие, или есть более прямой способ F1 ответить на F2, выполнив что-то, что требует его закрытия, и F1 делай то, что нужно.

Я не хотел бы, чтобы F1 даже знал, что F2 существует, или наоборот. Когда пользователь делает что-то в F1, что должно привести к значительному сдвигу контекста (например, отобразить какой-то другой фрагмент / активность), F1 должен сообщить об активности хостинга, возможно, через интерфейс слушателя, зарегистрированный в F1 (для поддержки нескольких возможных действий хостинга) , Затем действие будет организовано для появления F2 либо в его собственном действии, либо в другом действии. Точно так же, когда F2 завершает работу, он сообщает об активности своего хостинга через интерфейс слушателя, и это действие может направить управление обратно в соответствующее место.

Я несколько скептически отношусь к вашему подходу "F2 выполняет действие, которое должно привести к его закрытию", если только F2 не является DialogFragment.

...