繁体   English   中英

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

[英]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,该怎么办?

  1. 我是否有办法将MainActivity的上下文一直传递到FragmentC,以便FragmentC可以触发MainActivity中的回调?

  2. 反向呢? 有没有办法可以从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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM