Android LayoutInflater 参数详情
之前已经了解过了 layoutInflater.inflate 的三个参数,但是一端是时间又忘记了,还是写个博客吧
layoutInflater.inflate(int resource, ViewGroup root, boolean attachToRoot) 参数含义
如果root为null,attachToRoot将失去作用,设置任何值都没有意义。
如果root不为null,attachToRoot设为true,则会给加载的布局文件的指定一个父布局,即root。
如果root不为null,attachToRoot设为false,则会将布局文件最外层的所有layout属性进行设置,当该view被添加到父view当中时,这些layout属性会自动生效。
在不设置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,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不为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