LayoutInflater 顾名思义,就是解析 xml ,生成相应的 view 出来,在 activity 中我们可以 findviewbyid 获取到布局文件中的 view ,若是我们想要的 view 不在 activity 的布局文件中,那么就得通过 LayoutInflater 来获取了
LayoutInflater 对象有3种获取方式:
// 获取上下文对象的 LayoutInflater
LayoutInflater layoutInflater1 = context.getLayoutInflater();
// 自行初始化一个出来
LayoutInflater layoutInflater2 = LayoutInflater.from(this);
// 获取系统服务
LayoutInflater layoutInflater3 = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
上述3种方式其实没有区别,比如 activity.getLayoutInflater() 内部即使通过 LayoutInflater.from(this) 实现的,而 LayoutInflater.from(this) 又是通过 getSystemService(Context.LAYOUT_INFLATER_SERVICE) 实现了,只不过是进一步的封装罢了
但是有区别的地方来了,在于 LayoutInflater 的加载方法
LayoutInflater 的加载方法有2个:
public View inflate(@LayoutRes int resource, @Nullable ViewGroup root)
public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot)
解释一下参数:
- resource:xml 文件的 id
- root:一个可选的 ViewGroup 对象
- attachToRoot:是否将生成的视图 add 到 root 上
这里我就不贴源码了,说下结论,没有兴趣的去看源码,没几行
root 这个 ViewGroup 是用来给我们生成的 view 生成 LayoutParams 参数的,若是传入的 root 是 null ,那么我们生成的 view 的 LayoutParams 就是空的,此时系统会自动给 view 生成 宽高都是 match_parent 的 LayoutParams 属性对象。若 root 不为 null ,那么就会根据 xml 的配置来生成 LayoutParams 数据
attachToRoot 决定我们是不是把新生成的 view 添加到 root 里
最后我们看图来加深下印象
layout_root:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll_root"
android:orientation="vertical"
android:layout_width="300dp"
android:layout_height="400dp"
android:background="@color/forestgreen"
>
<TextView
android:id="@+id/tv_root_ll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="LL and root"
android:layout_gravity="center_horizontal"
android:textSize="20sp"
/>
</LinearLayout>
layout_child:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll_child"
android:orientation="vertical"
android:layout_width="200dp"
android:layout_height="200dp"
android:background="@color/violet"
>
<TextView
android:id="@+id/tv_child_ll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="LL and child"
android:layout_gravity="center_horizontal"
android:textSize="20sp"
/>
</LinearLayout>