Как эффективно общаться от ChildFragment к ParentFragment в Android

Фрагмент - это часть пользовательского интерфейса или поведения приложения, которая может быть помещена в действие.

Взаимодействие с фрагментами осуществляется через FragmentManager, который можно получить через Activity.getFragmentManager() и Fragment.getFragmentManager().

Фрагмент тесно связан с деятельностью, в которой он находится, и не может использоваться отдельно от него. Хотя фрагмент определяет свой собственный жизненный цикл, этот жизненный цикл зависит от его активности. Если действие остановлено, никакие фрагменты внутри него не могут быть запущены. Когда активность будет уничтожена, все фрагменты будут уничтожены.

Существуют различные способы связи между фрагментами, например интерфейс, общий ViewModel и т. Д.

Но знаете ли вы, что мы можем легко связываться от дочернего фрагмента к родительскому фрагменту и получать обратный вызов в onActivityResult() в родительском фрагменте, используя стандартные методы setTargetFragment() и getTargetFragment()?

Пример использования

Когда мы открываем фрагмент диалогового окна, в котором пользователю необходимо выбрать параметр из списка доступных параметров, а позже, когда они нажимают кнопку «ОК», нам необходимо вернуть выбранный параметр в родительский фрагмент.

Шаги

  1. Если мы хотим общаться от одного фрагмента к другому, тогда из ParentFragment мы должны использовать setTargetFragment (ParentFragment экземпляр, RequestCode).
  2. После этого мы вызываем метод show() во фрагменте диалога, чтобы отобразить список доступных опций.
  3. Затем используйте onActivityResult (RequestCode, Activity.RESULT_OK, намерение). Таким образом, обратный вызов от ChildFragment может быть получен в методе переопределения onActivityResult ParentFragment.
  4. Из ChildFragment мы должны использовать getTargetFragment(), который возвращает экземпляр ParentFragment, если что-то установлено с помощью setTargetFragment().

Давайте лучше разберемся на примере.

Шаг 1. Давайте вызовем showOptionsDialog() в родительском фрагменте, который показывает OptionsDialogFragment со списком параметров.

Шаг 2: Реализуйте onActivityResult() в ParentFragment, где мы получаем обратный вызов от ChildFragment и выполняем действие в зависимости от результата.

Шаг 3. Когда пользователь щелкает параметр в OptionsDialogFragment, затем вызывается onExit(selection: String), где мы пишем нашу логику для возврата обратного вызова к ParentFragment.

Из документации setTargetFragment().

Из документации getTargetFragment().

/**
 * Return the target fragment set by {#setTargetFragment}.
 */
@Nullable
final public Fragment getTargetFragment() {
  ............
}

Пожалуйста, дайте мне знать ваши предложения и комментарии.

Спасибо за прочтение!