フラグメントのレイアウトの親タグとしてmerge
タグを使用すると、2つの問題が発生します。
最初に、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.
ここで別の質問に対するいい答えが見つかりました。フラグメントライブラリは、置換で指定した親ビューグループに子を自動的に接続するというものです。したがって、attachToRoot
をfalse
に設定する必要があるという提案がありました。 merge
タグの場合は必須です。
これらのルールのいずれかを回避して、フラグメントのレイアウトにmerge
タグを使用することは可能ですか?
これらのルールのいずれかを回避して、フラグメントのレイアウトにマージタグを使用することは可能ですか?
いいえ。すでに見たように、merge
タグをルートとするレイアウトファイルをインフレートする場合は、有効な親ViewGroup
にアタッチする必要がありますmust。これを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;
}