LayoutInflater中inflate方法的三个参数

public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot)  

1.1 root不为null,attachToRoot为true

表示将resource指定的布局添加到root中,添加的过程中resource所指定的的布局的根节点的各个属性都是有效的

Activity布局:

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="vertical"  
    android:id="@+id/ll"  
    tools:context="org.sang.layoutinflater.MainActivity">  
</LinearLayout>

linearlayout.xml布局:

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:id="@+id/ll"  
    android:layout_width="200dp"  
    android:layout_height="200dp"  
    android:background="@color/colorPrimary"  
    android:gravity="center"  
    android:orientation="vertical">  

    <Button  
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content" />  
</LinearLayout>

java代码:

@Override  
protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.activity_main);  
    LinearLayout ll = (LinearLayout) findViewById(R.id.ll);  
    LayoutInflater inflater = LayoutInflater.from(this);  
    inflater.inflate(R.layout.linearlayout, ll,true);  
}  

这里我们都没写将inflate出来的View添加到ll中的代码,但是linearlayout布局文件就已经添加进来了。

这就是因为我第三个参数设置为了true,表示将第一个参数所指定的布局添加到第二个参数的View中。

1.2 root不为null,attachToRoot为false

如果root不为null,而attachToRoot为false的话,表示不将第一个参数所指定的View添加到root中。

那么这个时候有的小伙伴可能就有疑问了,既然不添加到root中,那我还写这么多干嘛?第二个参数直接给null不就可以了?

其实不然,这里涉及到另外一个问题:我们在开发的过程中给控件所指定的layout_width和layout_height到底是什么意思?该属性的表示一个控件在容器中的大小,就是说这个控件必须在容器中,这个属性才有意义,否则无意义。

这就意味着如果我直接将linearlayout加载进来而不给它指定一个父布局,则inflate布局的根节点的layout_width和layout_height属性将会失效(因为这个时候linearlayout将不处于任何容器中,那么它的根节点的宽高自然会失效)。

如果我想让linearlayout的根节点有效,又不想让其处于某一个容器中,那我就可以设置root不为null,而attachToRoot为false。

这样,指定root的目的也就很明确了,即root会协助linearlayout的根节点生成布局参数,只有这一个作用。

OK,还是上面的布局文件,如果我想将之添加到activity的布局中又该如何呢?

protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.activity_main);  
    LinearLayout ll = (LinearLayout) findViewById(R.id.ll);  
    LayoutInflater inflater = LayoutInflater.from(this);  
    View view = inflater.inflate(R.layout.linearlayout, ll, false);  
    ll.addView(view);  
}  
打赏