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.
ここで別の質問に対する良い回答を見つけました。フラグメント ライブラリは、replace で指定した親ビュー グループに子ビューを自動的にアタッチするとのことです。提案では、したがって を設定する必要があるとされていましたattachToRoot
。false
タグの場合merge
、これは必須です。
merge
これらのルールのいずれかを回避して、フラグメントのレイアウトにタグを使用することは可能ですか?
ベストアンサー1
これらのルールのいずれかを回避して、フラグメントのレイアウトにマージ タグを使用することは可能ですか?
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;
}