0

因此通常在Activity +片段通信中,在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()來之後推出的第一個片段,但然後用getChildFragmentManager())?

例如,如果我有MainActivity - > FragmentA - > FragmentB - > FragmentC?

  1. 是否有我一路走過來FragmentC通過我的MainActivity的背景下一路讓FragmentC可以在MainActivity觸發回調?

  2. 相反呢?有沒有一種方法可以從MainActivity返回FragmentC中的某個函數?或者我必須做一些事情,比如「MainActivity調用FragmentA中的一個函數,它調用FragmentB中的相同函數,調用FragmentC中的函數來完成我們想要的功能」?

回答

0

就我個人而言,我用一個EventBus庫(如this one)來以相對乾淨的方式完成此操作。那將是我的第一個建議。

停留在Android框架內:

如果你的目標是沒有緊密耦合組件他們之間的溝通,一種可能性是LocalBoadcastManager。你基本上可以再現EventBus的功能,但它更繁瑣/不太方便使用:

  • 你必須創建大量BroadcastReceiver類與IntentFilter S寄存器他們。
  • 所有的消息都播放了Intent s。這通常意味着大量亂丟代碼庫的自定義意圖操作字符串。任何相關數據都必須打包成額外數據(而使用EventBus則可以使用任何對象作爲消息)。

你也可以建立一個準EventBus。任何接收消息的組件都將爲該消息實現一個接口,並向某個Singleton類註冊自己。發送消息的任何人都會調用Singleton的方法,然後Singleton會遍歷所有已註冊的組件來傳遞消息。

+0

你會在Android框架/不使用第三方庫的情況下做什麼? – KaliMa

+0

@KaliMa我編輯了一些想法的帖子。坦率地說,我認爲你不會找到像第三方庫那樣靈活的解決方案。很有可能你使用成熟的庫(比如我鏈接的)會比使用自己的解決方案更少的bug和問題。 – Karakuri

相關問題