4

LayoutParamsがどのように機能するか知りたいですLayoutInflator。そして、違いは何ですか:

LinearLayout childLayout=(LinearLayout)inflater.inflate(R.layout.childitemlayout, null); //FIRST WAY
LinearLayout childLayout=(LinearLayout)inflater.inflate(R.layout.childitemlayout, container,false); //SECOND WAY

なぜなら、どちらの方法でも結果が異なるからです。実際には、2番目のインフレート方法では両方の子レイアウトの変更に対して正しい結果が得られますが、最初の方法では異なる結果が得られます。

これが私のコードです:

MainActivity.Java

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        LinearLayout mainLayout=(LinearLayout)findViewById(R.id.mainLayout);
        LayoutInflater inflater=LayoutInflater.from(getApplicationContext());
        for(int i=0;i<10;i++){
            LinearLayout childLayout=(LinearLayout)inflater.inflate(R.layout.childitemlayout, null); //First WAY
//          LinearLayout childLayout=(LinearLayout)inflater.inflate(R.layout.childitemlayout, mainLayout,false);  //SECOND WAY
            mainLayout.addView(childLayout);
        }
    }


main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

</LinearLayout>


childitemlayout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="80dp"
    android:layout_height="80dp"
    android:orientation="vertical" 
    android:background="#525f67">

    <TextView android:id="@+id/btn"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="Button"
            android:gravity="center"
            />


</LinearLayout>  <!-- Both ways gives different result  --> 


<!-- 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical" 
    android:background="#525f67">

    <TextView android:id="@+id/btn"
            android:layout_width="80dp"
            android:layout_height="80dp"
            android:text="Button"
            android:gravity="center"
            />


</LinearLayout> Both method gives SAME result   -->  
4

1 に答える 1

12

2つの方法の主な違いinflate()は、2番目のパラメーター(パラメーター)と、膨張したレイアウトファイルのルートビューにViewGroup適切な設定を行う際のその使用法です。LayoutParamsこれはLayoutParams、ビューのさまざまなレイアウト属性(幅、高さ、配置ルールなど)を保持し、そのビューの親がビューを適切に表示できるようにするために必要なため、重要です。

最初の方法は基本的に次のように述べています。このレイアウトファイルから階層ビューを作成しますがLayoutParams、拡張された階層のルートには割り当てないでください(おそらく、親がまだわからないため)。また、拡張されたビューを親にアタッチしないでください

2番目のinflateメソッドは、次のように述べています。このレイアウトファイルから階層ビューを構築し、適切なLayoutParams(inflateメソッドに指定された2番目のパラメーターに基づいて)を膨張した階層のルートに割り当てます。また、膨張したビューを親にアタッチしないでください。

最初のケースでは、膨張したレイアウトファイル(R.layout.childitemlayout)のルートには何もLayoutParams設定されていません( 2番目のパラメーターが設定されており、生成するタイプがわからないinflateため、メソッドは何も割り当てませんでした)。幅/高さの値は失われます。後で実行するときに、のをチェックし、それらが(そのメソッドを使用して)のインスタンスを自動的に設定することを確認します。このメソッドは、特に水平の場合、幅/高さがに設定されるインスタンスを返します。したがって、設定した固定値ではなく、サイズが最終的になります。nullLayoutParamsmainLayout.addView(childLayout);mainLayoutLayoutParamschildLayoutnullLayoutParamsgenerateDefaultLayoutParams()LinearLayoutLayoutParamsWRAP_CONTENTchildLayoutWRAP_CONTENT

2番目のケースでは、inflateメソッドは、を生成するためLinearLayout mainLayoutに使用されるものとしてを提案したことを確認します。これは、レイアウトファイルから取得した固定値(幅/高さに使用)をの適切なインスタンスに保存できることを意味します。を実行すると、が 適切なインスタンス(レイアウトファイルで使用されている値を持つ)を持ち、そのインスタンスを呼び出さないことがわかります。ViewGroupLayoutParamsLayoutParamsmainLayout.addView(childLayout);mainLayoutchildLayoutLayoutParamsgenerateDefaultLayoutParams()

于 2013-01-15T13:16:35.687 に答える