2012-11-12 67 views
35

如果我使用merge標記爲我的片段佈局中的父標籤,我遇到兩個問題:你可以使用帶碎片的合併標籤嗎?

  • 第一,在onCreateView(),如果我指定不附加到根,我得到的錯誤:

    android.view.InflateException: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true

  • 如果我去做附加到根,我得到的錯誤:

    java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

我在這裏發現了另一個問題的好答案,表示片段庫會自動將孩子附加到您在replace中指定的父視圖組。建議您需要將attachToRoot設置爲false。對於merge標籤,這是必需的。

是否可以避開這些規則中的任何一個,以便將merge標記用於片段佈局?

回答

39

Is it possible to get around either of these rules to use the merge tag for a fragment's layout?

號如你所見,當你吹它具有merge標籤作爲其根,你必須附加到一個有效的父ViewGroup佈局文件。將其附加到onCreateView中的容器不正確,因爲該方法返回的View將被框架添加。

你總是可以只創建在onCreateView方法,用來連接充氣佈局的封裝佈局(並返回這個包裝佈局),而這將使merge標籤優化沒用,因爲你可以在XML中添加包裝佈局

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    LinearLayout wrapper = new LinearLayout(getActivity()); // for example 
    inflater.inflate(R.layout.layout_with_merge_as_root, wrapper, true); 
    return wrapper; 
} 
+1

所以'android.view.InflateException:從開始佈局文件只能與一個有效的ViewGroup根和attachToRoot = TRUE;使用是因爲'attachToRoot = FALSE'(所述的ViewGroup根是有效的) ? –

+0

@Mr_and_Mrs_D是的,因爲對於'false',膨脹後的佈局不會被添加到'ViewGroup'中,這正是'merge'標籤所要求的。另外,我認爲如果對'attachToRoot'使用'true',而對第二個參數使用'null'' ViewGroup'(意味着沒有父對象來連接膨脹佈局),則會拋出同樣的異常。 – Luksprog

+0

謝謝 - 多煩人 - 兩種情況下的相同錯誤消息。關於'merge'和'fragments',你可能會發現[this](http://stackoverflow.com/a/15315289/281545) –

相關問題