嵌套片段/活动之间的通信(双向)

时间:2016-10-06 00:04:29

标签: java android android-fragments android-activity communication

通常在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?

  1. 有没有办法让我将MainActivity的上下文一直传递给FragmentC,以便FragmentC可以在MainActivity中触发回调?

  2. 反过来怎么样?有没有办法可以从MainActivity一直调用FragmentC中的某些函数?或者我必须做类似的事情#34; MainActivity调用FragmentA中的一个函数,它在FragmentB中调用相同的函数,它调用FragmentC中的函数来完成我们想要的事情"?

1 个答案:

答案 0 :(得分:0)

我个人使用EventBus库(如this one)以相对干净的方式完成此任务。这将是我的第一个建议。

保持在Android框架内:

如果你的目标是在没有紧密耦合的情况下在组件之间进行通信,则有一种可能性是LocalBoadcastManager。您基本上可以重现EventBus的功能,但它使用起来更麻烦/更不方便:

  • 您必须创建多个BroadcastReceiver类并使用IntentFilter s。
  • 注册它们
  • 您的所有讯息均已播出Intent秒。这通常意味着许多自定义意图操作字符串乱丢代码库。任何相关数据都必须打包到额外内容中(而使用EventBus,您可以使用任何对象作为消息)。

您还可以构建一个准EventBus。接收消息的任何组件都将实现该消息的接口,并使用某些Singleton类注册自己。任何发送消息的人都会调用Singleton的方法,然后迭代任何注册的组件来传递消息。