[英]Communication between nested Fragments / Activities (both ways)
因此,通常在Activity + Fragment通信中,可以在onAttach方法中将事物分配给Context,例如您从回调接口定义的侦听器,然后使用它来通信/调用在底层Activity中实现的功能。
例如:
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;
}
}
一切都很好,但是如果您使用嵌套的Fragments(即使用getSupportFragmentManager()启动第一个Fragment,然后再使用getChildFragmentManager()怎么办)呢?
例如,如果我有MainActivity-> FragmentA-> FragmentB-> FragmentC,该怎么办?
我是否有办法将MainActivity的上下文一直传递到FragmentC,以便FragmentC可以触发MainActivity中的回调?
反向呢? 有没有办法可以从MainActivity一直调用FragmentC中的某些函数? 还是我必须做些类似的事情“ MainActivity在FragmentA中调用一个函数,而在FragmentB中调用相同的函数,而在FragmentB中调用我们想要的东西”
我个人已经使用EventBus库(像这样的库)以相对干净的方式完成了此任务。 那将是我的第一个建议。
保持在Android框架之内:
如果您的目标是在组件之间通信而不紧密耦合它们,则一种可能是LocalBoadcastManager
。 您基本上可以重现EventBus的功能,但是使用起来比较麻烦/较不方便:
BroadcastReceiver
类,并向IntentFilter
注册它们。 Intent
。 这通常意味着大量自定义意图操作字符串会乱码。 任何相关数据都必须打包到其他文件中(而使用EventBus,则可以使用任何对象作为消息)。 您还可以构建一个准EventBus。 任何接收消息的组件都将实现该消息的接口,并向某个Singleton类注册自身。 任何发送消息的人都会调用Singleton的方法,该方法然后遍历所有已注册的组件以传递消息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.