簡體   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