Таким образом, обычно в взаимодействии 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?
Есть ли способ для меня, чтобы передать контекст моего MainActivity все пути до FragmentC так, что FragmentC может вызвать обратные вызовы в MainActivity?
А как насчет обратного? Есть ли способ, с помощью которого я могу вызвать некоторую функцию в FragmentC полностью назад из MainActivity? Или мне нужно сделать что-то вроде «MainActivity вызывает функцию в FragmentA, которая вызывает ту же функцию в FragmentB, которая вызывает функцию в FragmentC, которая делает то, что мы хотим»?
Что бы вы сделали в рамках Android/без использования сторонних библиотек? – KaliMa
@KaliMa Я редактировал сообщение с некоторыми идеями. Честно говоря, я не думаю, что вы найдете почти такое же гибкое решение, как и сторонние библиотеки. По всей вероятности, у вас будет меньше ошибок и проблем с использованием зрелых библиотек (например, с теми, с которыми я связан), чем с помощью собственного решения. – Karakuri