最初の方法:
LinearLayout parent = ...;
View child = LayoutInflator.inflate(context, parent, true);
2 番目の方法:
LinearLayout parent = ...;
View child = LayoutInflator.inflate(context, null, false);
parent.addView(child);
違いはありますか?
最初の方法:
LinearLayout parent = ...;
View child = LayoutInflator.inflate(context, parent, true);
2 番目の方法:
LinearLayout parent = ...;
View child = LayoutInflator.inflate(context, null, false);
parent.addView(child);
違いはありますか?
inflate メソッドのソースを確認すると、次のことがわかります。
if (root != null) {
if (DEBUG) {
System.out.println("Creating params from root: " +
root);
}
// Create layout params that match root, if supplied
params = root.generateLayoutParams(attrs);
if (!attachToRoot) {
// Set the layout params for temp if we are not
// attaching. (If we are, we use addView, below)
temp.setLayoutParams(params);
}
}
/* ... */
// We are supposed to attach all the views we found (int temp)
// to root. Do that now.
if (root != null && attachToRoot) {
root.addView(temp, params);
}
したがって、あなたの例では違いはありません。
このシナリオには違いがあります
View child = LayoutInflator.inflate(context, parent, false);
子は親と同じ LayoutParams を持ちますが、アタッチされないため、別のビューになります。
Android 開発者のドキュメントによると:
View child = LayoutInflator.inflate(context, parent, true);
子を親に追加します。
View child = LayoutInflator.inflate(context, null, false);
しない。
リファレンスを確認できます: android.view.ViewGroup.inflate
以下のソースコードから:
471 if (root != null) {
472 if (DEBUG) {
473 System.out.println("Creating params from root: " +
474 root);
475 }
476 // Create layout params that match root, if supplied
477 params = root.generateLayoutParams(attrs);
478 if (!attachToRoot) {
479 // Set the layout params for temp if we are not
480 // attaching. (If we are, we use addView, below)
481 temp.setLayoutParams(params);
482 }
483 }
484
485 if (DEBUG) {
486 System.out.println("-----> start inflating children");
487 }
488 // Inflate all children under temp
489 rInflate(parser, temp, attrs, true);
490 if (DEBUG) {
491 System.out.println("-----> done inflating children");
492 }
493
494 // We are supposed to attach all the views we found (int temp)
495 // to root. Do that now.
496 if (root != null && attachToRoot) {
497 root.addView(temp, params);
498 }
499
500 // Decide whether to return the root that was passed in or the
501 // top view found in xml.
502 if (root == null || !attachToRoot) {
503 result = temp;
504 }
行 471 ~ 482 から、親ビューに一致する新しく作成されたパラメーターに子ビューのレイアウト パラメーターを設定します。
496 ~ 498 行目から、親はレイアウト パラメータを使用して子ビューを追加します。
したがって、違いは、レイアウトパラメーターを子ビューに設定するかどうかです
はい、違いがあります。
if True
: 膨張した階層をルート パラメータにアタッチする必要があるかどうか。
if False
: false の場合、ルートはLayoutParams
、XML のルート ビューの正しいサブクラスを作成するためにのみ使用されます。
このパラメーターは通常、Listview に行を追加するために Adapter クラスを使用したくない場合に使用します。ビューごとに行を作成したり、レイアウトに子ビューがある場合に使用します。
context
リソース ID を呼び出してインフレートしたとしますが、これはかなり混乱します。次の違いがあります。
レイアウト パラメータのため、レイアウト リソースのトップ レベルからのレイアウト パラメータのparent
使用。2 番目のケースでは、これらのレイアウト パラメータは適用されません。