Android LayoutInflater 参数详情

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 布局



    

    


sub_view 布局



详解 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 参数详情)