美文网首页
Android LayoutInflater 参数详情

Android LayoutInflater 参数详情

作者: 宝塔山上的猫 | 来源:发表于2019-07-18 18:08 被阅读0次

    Android LayoutInflater 参数详情

    之前已经了解过了 layoutInflater.inflate 的三个参数,但是一端是时间又忘记了,还是写个博客吧

    layoutInflater.inflate(int resource, ViewGroup root, boolean attachToRoot) 参数含义

    1. 如果root为null,attachToRoot将失去作用,设置任何值都没有意义。

    2. 如果root不为null,attachToRoot设为true,则会给加载的布局文件的指定一个父布局,即root。

    3. 如果root不为null,attachToRoot设为false,则会将布局文件最外层的所有layout属性进行设置,当该view被添加到父view当中时,这些layout属性会自动生效。

    4. 在不设置attachToRoot参数的情况下,如果root不为null,attachToRoot参数默认为true。

    项目布局如下,

    MainActivity 布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <TextView
            android:text="hello, world"
            android:layout_width="match_parent"
            android:layout_height="20dp" />
    
        <FrameLayout
            android:id="@+id/main_layout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
             />
    
    </LinearLayout>
    

    sub_view 布局

    <?xml version="1.0" encoding="utf-8"?>
    <Button xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="300dp"
        android:layout_height="90dp"
        android:text="Button" >
    
    </Button>
    

    详解 root 为 null

    首先 如果root为null 的时候,即:

    layoutInflater.inflate(int resource, null)
    

    此时调用的是:

    layoutInflater.inflate(resource, root, root != null) 
    =》
    layoutInflater.inflate(resource, null, false) 
    

    示例:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FrameLayout frameLayout = findViewById(R.id.main_layout);
        LayoutInflater layoutInflater = LayoutInflater.from(this);
        View buttonLayout = layoutInflater.inflate(R.layout.sub_view, null);
        frameLayout.addView(buttonLayout);
    }
    

    此时会发现 sub_view 中的 button 即使设置了 layout_width / layout_height 也是无效的,因为 sub_view 的父布局不存在,所以无法设置。

    root_null.PNG

    root不为null,attachToRoot设为true

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FrameLayout frameLayout = findViewById(R.id.main_layout);
        LayoutInflater layoutInflater = LayoutInflater.from(this);
        View inflate = layoutInflater.inflate(R.layout.sub_view, frameLayout, true);
    }
    

    此时 sub_view 设置了父布局, 并且 attachToRoot 为 true 将会直接添加到 frameLayout 中,并且 sub_view 中的 button 可自由设置宽高

    root_not_null.PNG

    root不为null,attachToRoot设为false

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FrameLayout frameLayout = findViewById(R.id.main_layout);
        LayoutInflater layoutInflater = LayoutInflater.from(this);
        View inflate = layoutInflater.inflate(R.layout.sub_view, frameLayout, false);
        frameLayout.addView(inflate);
    }
    

    此时 sub_view 虽然设置了父布局,但是 attachToRoot 为 false , 没有直接添加到 frameLayout 布局中,所以不会显示在界面中。此时需要 frameLayout 主动添加 sub_view 布局,这些layout属性会自动生效,显示在界面上。效果如上图

    参考资料

    Android LayoutInflater原理分析,带你一步步深入了解View(一)
    https://blog.csdn.net/guolin_blog/article/details/12921889

    相关文章

      网友评论

          本文标题:Android LayoutInflater 参数详情

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