[英]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.