美文网首页
LayoutInflater总结

LayoutInflater总结

作者: tinyvampirepudg | 来源:发表于2019-07-13 06:57 被阅读0次

    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方法两个参数和三个参数的区别

    相关文章

      网友评论

          本文标题:LayoutInflater总结

          本文链接:https://www.haomeiwen.com/subject/ooghkctx.html