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

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

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 で指定した親ビュー グループに子ビューを自動的にアタッチするとのことです。提案では、したがって を設定する必要があるとされていましたattachToRootfalseタグの場合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;
}

おすすめ記事