LayoutInflater总结

简介: 总结:1、root不为空,attachToRoot为true。此时布局会直接添加到root上,并且root布局中设置的宽高参数会生效。此时如果再执行root.addView(view)的话会报错。2、root不为空,attachToRoot为false。此时生成的view的宽高参数有效,但是view不会直接添加进root。3、root为空,attachToRoot的值随意。当root为null时,不论attachToRoot为true还是为false,显示效果都是一样的。此时layout_linearlayout.xml 中的根布局设置的宽高属性会失效。

LayoutInflater总结

参考:
三个案例带你看懂LayoutInflater中inflate方法两个参数和三个参数的区别

LayoutInflater#inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot)

总结:
1、root不为空,attachToRoot为true。
此时布局会直接添加到root上,并且root布局中设置的宽高参数会生效。
此时如果再执行root.addView(view)的话会报错。

2、root不为空,attachToRoot为false。
此时生成的view的宽高参数有效,但是view不会直接添加进root。

3、root为空,attachToRoot的值随意。
当root为null时,不论attachToRoot为true还是为false,显示效果都是一样的。
此时layout_linearlayout.xml 中的根布局设置的宽高属性会失效。

代码测试如下:
1、activity布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:id="@+id/ll"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".test.view.LayoutInflaterTestActivity">

</LinearLayout>

2、layout_linearlayout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    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>

3、Java代码:

package com.tiny.demo.firstlinecode.test.view;

import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;

import com.tiny.demo.firstlinecode.R;

/**
 * @Description: LayoutInflater#inflate()原理解析
 * https://blog.csdn.net/u012702547/article/details/52628453
 * @Author wangjianzhou@qding.me
 * @Date 2019/1/25 11:23 AM
 * @Version
 */
public class LayoutInflaterTestActivity extends AppCompatActivity {
    public static void actionStart(Context context) {
        Intent starter = new Intent(context, LayoutInflaterTestActivity.class);
        context.startActivity(starter);
    }

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

        // 1、root不为空,attachToRoot为true
        // 下面这段代码,会直接让布局显示出来。
        LinearLayout ll = findViewById(R.id.ll);
        LayoutInflater inflater = LayoutInflater.from(this);
        View view = inflater.inflate(R.layout.layout_linearlayout, ll, true);

        //这里会报错,原因就是因为当第三个参数为true时,会自动将第一个参数所指定的View添加到第二个参数所指定的View中。
        // java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
        ll.addView(view);

        // 2、root不为空,attachToRoot为false
        // 如果我想让linearlayout的根节点有效,又不想让其处于某一个容器中,那我就可以设置root不为null,而attachToRoot为false。
        LinearLayout ll = findViewById(R.id.ll);
        LayoutInflater inflater = LayoutInflater.from(this);
        View view = inflater.inflate(R.layout.layout_linearlayout, ll, false);
        ll.addView(view);

        // 3、root为null,attachToRoot的值随意
        // 当root为null时,不论attachToRoot为true还是为false,显示效果都是一样的。
        // 此时layout_linearlayout.xml 中的根布局设置的宽高属性会失效。
        LinearLayout ll = findViewById(R.id.ll);
        LayoutInflater inflater = LayoutInflater.from(this);
        View view = inflater.inflate(R.layout.layout_linearlayout, null, true);
        ll.addView(view);
    }
}

参考:
三个案例带你看懂LayoutInflater中inflate方法两个参数和三个参数的区别

相关文章
CoordinatorLayout的使用如此简单
CoordinatorLayout的使用如此简单
SwipeRefreshLayout与RecyclerView的巧夺天工(二)
SwipeRefreshLayout与RecyclerView的巧夺天工(二)
79 0
SwipeRefreshLayout与RecyclerView的巧夺天工(二)
SwipeRefreshLayout与RecyclerView的巧夺天工(一)
SwipeRefreshLayout与RecyclerView的巧夺天工(一)
94 0
|
Android开发
CoordinatorLayout使用浅析
CoordinatorLayout使用浅析
228 0
CoordinatorLayout使用浅析
CoordinatorLayout 之深入理解
上篇在对 CoordinatorLayout 作了一些简单介绍,以了解 CoordinatorLayout 带来的一些特性和常见用途。本篇将对 CoordinatorLayout 的源码进行一些分析,以了解它的相关特性的运行原理,以及 Behavior 的执行过程。
1359 0
|
XML Android开发 数据格式
|
容器
CoordinatorLayout之初步认识
CoordinatorLayout是2015 I/O大会发布的一种布局,它可以说是一个非常强大的FrameLayout,主要用于协调(Coordinate)子控件,来帮助实现它们之间的一些交互效果。
1171 0