0

Таким образом, обычно в взаимодействии Activity + Fragment в методе onAttach вы можете назначать вещи контексту, например слушателю, который вы определили из интерфейса обратного вызова, а затем использовать его для функции связи/вызова, реализованные в базовом Управлении.Связь между вложенными фрагментами/действиями (в обоих направлениях)

Например:

public class TestDialogFragment extends DialogFragment { 
    private static final String ARGUMENT_KEYWORD = "argument_keyword"; 
    private String keyword; 
    private Button okButton; 
    private CallbackInterface callbackInterface; 

    public interface CallbackInterface { 
     void onCallbackInvoked(String keyword); 
    } 

    public static TestDialogFragment newInstance(String keyword) { 
     Bundle args = new Bundle(); 
     TestDialogFragment fragment = new TestDialogFragment(); 
     args.putString(ARGUMENT_KEYWORD, keyword); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     try { 
      callbackInterface = (CallbackInterface) context; 
     } 
     catch (ClassCastException e) { 
      throw new ClassCastException(context.toString() + " must implement TestDialogFragment.CallbackInterface"); 
     } 
    } 

    @Override 
    public void onCreate(@Nullable Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     keyword = getArguments().getString(ARGUMENT_KEYWORD); 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View contentView = inflater.inflate(R.layout.dialogfragment_test, container, false); 
     okButton = (Button) contentView.findViewById(R.id.okButton); 
     okButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       callbackInterface.onCallbackInvoked(keyword); 
       getDialog().dismiss(); 
      } 
     }); 
     return contentView; 
    } 
} 

Это все хорошо, но что, если вы используете вложенные фрагменты (т.е. с использованием getSupportFragmentManager() для запуска первого фрагмента, но затем с помощью getChildFragmentManager() после этого)?

Например, если у меня есть MainActivity -> FragmentA -> FragmentB -> FragmentC?

  1. Есть ли способ для меня, чтобы передать контекст моего MainActivity все пути до FragmentC так, что FragmentC может вызвать обратные вызовы в MainActivity?

  2. А как насчет обратного? Есть ли способ, с помощью которого я могу вызвать некоторую функцию в FragmentC полностью назад из MainActivity? Или мне нужно сделать что-то вроде «MainActivity вызывает функцию в FragmentA, которая вызывает ту же функцию в FragmentB, которая вызывает функцию в FragmentC, которая делает то, что мы хотим»?

ответ

0

Лично я использовал библиотеку EventBus (как this one) для достижения этой цели в относительно чистом виде. Это была бы моя первая рекомендация.

Пребывание в Android рамки:

Если ваша цель состоит в том, чтобы общаться между компонентами без плотного их сочетания, одна возможность заключается в LocalBoadcastManager. Вы можете существенно воспроизвести функциональность EventBus, однако это более громоздким/менее удобен в использовании:

  • Вы должны создать многочисленные BroadcastReceiver классы и зарегистрировать их IntentFilter с.
  • Все ваши сообщения переданы Intent s. Обычно это означает, что множество пользовательских строк действия намерения забивают кодовую базу. Любые релевантные данные должны быть упакованы в дополнительные функции (тогда как с EventBus вы можете использовать любой объект в качестве сообщения).

Вы также можете построить квази-EventBus. Любой компонент, который получает сообщения, будет реализовывать интерфейс для этого сообщения и регистрировать себя с некоторым классом Singleton. Любой, кто отправляет сообщение, вызывает метод Singleton, который затем выполняет итерацию по любым зарегистрированным компонентам для доставки сообщения.

+0

Что бы вы сделали в рамках Android/без использования сторонних библиотек? – KaliMa

+0

@KaliMa Я редактировал сообщение с некоторыми идеями. Честно говоря, я не думаю, что вы найдете почти такое же гибкое решение, как и сторонние библиотеки. По всей вероятности, у вас будет меньше ошибок и проблем с использованием зрелых библиотек (например, с теми, с которыми я связан), чем с помощью собственного решения. – Karakuri