web-dev-qa-db-ja.com

フラグメントでマージタグを使用できますか?

フラグメントのレイアウトの親タグとして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.

ここで別の質問に対するいい答えが見つかりました。フラグメントライブラリは、置換で指定した親ビューグループに子を自動的に接続するというものです。したがって、attachToRootfalseに設定する必要があるという提案がありました。 mergeタグの場合は必須です。

これらのルールのいずれかを回避して、フラグメントのレイアウトにmergeタグを使用することは可能ですか?

42
Plantage

これらのルールのいずれかを回避して、フラグメントのレイアウトにマージタグを使用することは可能ですか?

いいえ。すでに見たように、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;
}
45
Luksprog