通常在Activity + Fragment通信中,在onAttach方法中,您可以将事物分配给Context,例如您从回调接口定义的侦听器,然后使用它来通信/调用底层中实现的函数活性。
例如:
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()启动第一个Fragment但之后使用getChildFragmentManager())会怎么样?
例如,如果我有MainActivity,那么> FragmentA - > FragmentB - > FragmentC?
有没有办法让我将MainActivity的上下文一直传递给FragmentC,以便FragmentC可以在MainActivity中触发回调?
反过来怎么样?有没有办法可以从MainActivity一直调用FragmentC中的某些函数?或者我必须做类似的事情#34; MainActivity调用FragmentA中的一个函数,它在FragmentB中调用相同的函数,它调用FragmentC中的函数来完成我们想要的事情"?
答案 0 :(得分:0)
我个人使用EventBus库(如this one)以相对干净的方式完成此任务。这将是我的第一个建议。
保持在Android框架内:
如果你的目标是在没有紧密耦合的情况下在组件之间进行通信,则有一种可能性是LocalBoadcastManager
。您基本上可以重现EventBus的功能,但它使用起来更麻烦/更不方便:
BroadcastReceiver
类并使用IntentFilter
s。Intent
秒。这通常意味着许多自定义意图操作字符串乱丢代码库。任何相关数据都必须打包到额外内容中(而使用EventBus,您可以使用任何对象作为消息)。您还可以构建一个准EventBus。接收消息的任何组件都将实现该消息的接口,并使用某些Singleton类注册自己。任何发送消息的人都会调用Singleton的方法,然后迭代任何注册的组件来传递消息。