2014-08-28 153 views
5

片段片段交互的Android最佳實踐(描述爲herehere)強制Activity實現由子片段定義的偵聽器。 Activity然後管理片段之間的通信。Android嵌套片段片段交互

從我的理解,這是爲了保持片段彼此鬆散耦合。但是,

  1. 這也是嵌套片段的情況嗎?我可以想象,嵌套片段可以直接報告給它的父代片段而不是活動。

  2. 如果一個嵌套片段的父代片段實現它的監聽器,一個(或者應該一個)如何要求父代片段執行此操作。換句話說,是一種類似於範例以下但Fragments

    @Override 
    public void onAttach(Activity activity) { 
        super.onAttach(activity); 
    
        try { 
         mCallback = (OnHeadlineSelectedListener) activity; 
        } catch (ClassCastException e) { 
         throw new ClassCastException(activity.toString() 
           + " must implement OnHeadlineSelectedListener"); 
        } 
    } 
    

回答

1

只要你定義片段中的一個接口,你可以有父活動或父片段實現它。沒有規定說片段不應該實現一個子片段的接口。一個有意義的例子是片段A有兩個子片段B,C,A實現了B的接口,當A接到一個回調,它可能需要更新片段C.與活動完全一樣,只是不同的級別。

+0

但是,在問題中發佈的google鏈接中描述的方式通過使用片段的onAttach()附加偵聽器並鼓勵/強制將其作爲「Activity」,否則將引發錯誤。 – bcorso 2014-08-28 22:16:37

+0

該文檔鼓勵片段不應直接與另一個片段進行通信。並不是說它必須是一個活動。 – CChi 2014-08-28 22:19:11

+1

如果偵聽器沒有被「Activity」實現,Google是否會建議拋出一個'Exception'?我應該刪除該代碼嗎? – bcorso 2014-08-28 22:22:51

0

您可以使用getParentFragment()爲子女/父母互動實施相同的模式。父片段引用通過其ChildFragmentManager添加的片段。如果此片段直接附加到Activity,則此方法返回null。

4

如果有人想以確保母公司的背景下實現的示例實現了回調,而不在乎它是否是一個活動或片段,對我下面的工作:

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    if (context instanceof Callbacks) { 
     mCallbacks = (Callbacks) context; 
    } else { 
     if (getParentFragment() != null && getParentFragment() instanceof Callbacks) { 
      mCallbacks = (Callbacks) getParentFragment(); 
     } else { 
      throw new RuntimeException(context.toString() 
        + " must implement " + TAG + ".Callbacks"); 
     } 
    } 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 
    mCallbacks = null; 
} 

享受!