4

最初の方法:

LinearLayout parent = ...;
View child = LayoutInflator.inflate(context, parent, true);

2 番目の方法:

LinearLayout parent = ...;
View child = LayoutInflator.inflate(context, null, false);
parent.addView(child);

違いはありますか?

4

6 に答える 6

3

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 を持ちますが、アタッチされないため、別のビューになります。

于 2013-07-17T02:25:03.620 に答える
1

Android 開発者のドキュメントによると:

View child = LayoutInflator.inflate(context, parent, true);

子を親に追加します。

View child = LayoutInflator.inflate(context, null, false);

しない。

リファレンスを確認できます: android.view.ViewGroup.inflate

于 2013-07-17T02:13:00.587 に答える
0

以下のソースコードから:

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 行目から、親はレイアウト パラメータを使用して子ビューを追加します。

したがって、違いは、レイアウトパラメーターを子ビューに設定するかどうかです

于 2013-07-17T02:25:15.187 に答える
0

はい、違いがあります。

if True: 膨張した階層をルート パラメータにアタッチする必要があるかどうか。

if False: false の場合、ルートはLayoutParams、XML のルート ビューの正しいサブクラスを作成するためにのみ使用されます。

このパラメーターは通常、Listview に行を追加するために Adapter クラスを使用したくない場合に使用します。ビューごとに行を作成したり、レイアウトに子ビューがある場合に使用します。

于 2013-07-17T02:13:13.860 に答える
0

contextリソース ID を呼び出してインフレートしたとしますが、これはかなり混乱します。次の違いがあります。

レイアウト パラメータのため、レイアウト リソースのトップ レベルからのレイアウト パラメータのparent使用。2 番目のケースでは、これらのレイアウト パラメータは適用されません。

于 2013-07-17T02:13:31.213 に答える