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

因为,这两种方法都给了我不同的结果。实际上,第二个充气方法为我提供了两个子布局更改的正确结果,但第一个方法会给我不同的结果。

这是我的代码:

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

inflate()这两种方法的主要区别在于第二个参数(ViewGroup参数)及其在LayoutParams为膨胀布局文件的根视图设置正确性时的用途。这很重要,因为需要LayoutParams保留视图的各种布局属性(如宽度、高度、定位规则等),以便该视图的父级可以正确显示该视图。

第一种方法基本上是说:从这个布局文件构建层次视图,但不要分配LayoutParams给膨胀层次结构的根(可能是因为父级还不知道),也不要将膨胀视图附加到父级

第二个 inflate 方法说:从这个布局文件构建层次视图,并将适当的LayoutParams(基于给 inflate 方法的第二个参数)分配给膨胀层次结构的根,也不将膨胀视图附加到父级.

在第一种情况下,膨胀的布局文件(R.layout.childitemlayout)的根将没有任何LayoutParams设置(该inflate方法没有分配任何内容,因为第二个参数是null并且它不知道LayoutParams要生成哪种类型),所以你的固定宽度/高度值丢失。稍后,当您mainLayout.addView(childLayout);mainLayout检查 的LayoutParamschildLayout,会看到这些是null并且将自动设置 的实例LayoutParams(使用它的generateDefaultLayoutParams()方法)。此方法,在特定情况下为 水平LinearLayout,将返回LayoutParams宽度/高度将设置为的实例WRAP_CONTENT。所以你childLayout最终会得到WRAP_CONTENT它的大小,而不是你在它们上设置的固定值。

在第二种情况下,该inflate方法看到您建议将LinearLayout mainLayout用于ViewGroup生成LayoutParams. 这意味着从布局文件中检索到的固定值(用于宽度/高度)可以存储在LayoutParams. 当您 执行mainLayout.addView(childLayout);. mainLayout_ _childLayoutLayoutParamsgenerateDefaultLayoutParams()

于 2013-01-15T13:16:35.687 回答