44

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する必要があるという提案がありましたfalsemergeタグの場合は必須です。

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

4

1 に答える 1

48

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

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;
}
于 2012-11-12T20:53:52.343 に答える