LayoutInflate

LayoutInflate主要用于加载布局,包括在Activity中调用setContentView(),方法内部其实也是用LayoutInflate来实现的。

基本用法:
两句语句都可以获取到LayoutInflater的实例
//两种初始化方式
LayoutInflater inflater = LayoutInflater.from(this);
// LayoutInflater inflater1 = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
1
2
3
因为在源码里,from就是一个系统封装好的方法,里面用了context.getSystemService……


调用他的inflate方法加载布局
inflate()方法一般接收两个参数,第一个参数就是要加载的布局id,第二个参数是指给该布局的外部再嵌套一层父布局,如果不需要就直接传null。
这样就成功成功创建了一个布局的实例,之后再将它添加到指定的位置就可以显示出来了。
inflater.inflate(resourceId, root);
1
举个栗子:
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/main_layout"
android:orientation="vertical">

</LinearLayout>
1
2
3
4
5
6
7
button_layout.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="button">

</RelativeLayout>
1
2
3
4
5
6
如何通过LayoutInflater来将 button_layout布局 添加到主布局文件的LinearLayout中呢?
MainActivity中
用inflate()方法来加载button_layout这个布局,然后调用LinearLayout的addView()方法将它添加到LinearLayout中。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LinearLayout mainLayout = findViewById(R.id.main_layout);
//两种初始化方式
LayoutInflater inflater = LayoutInflater.from(this);
// LayoutInflater inflater1 = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View buttonLayout = inflater.inflate(R.layout.button_layout, null);
mainLayout.addView(buttonLayout);
1
2
3
4
5
6
7
8
9
10
效果


改变button的大小

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="300dp"
android:layout_height="100dp"
android:text="button">

</RelativeLayout>
1
2
3
4
5
6
发现button大小并未改变。

layout_width和layout_height 其实是用于设置View在布局中的大小的,也就是View必须存在于一个布局中,这两个参数的设定才有效。这也是为什么这两个属性叫作layout_width和layout_height,而不是width和height。

所以最简单的是在Button的外面再套一个布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
>

<Button
android:layout_width="300dp"
android:layout_height="150dp"
android:text="button"/>

</RelativeLayout>
1
2
3
4
5
6
7
8
9
10
11
变大了!


问题又来了,平时在Activity中指定布局文件的时候,最外层的那个布局是可以指定大小的呀,layout_width和layout_height都是有作用的。
这主要是因为,在setContentView()方法中,Android会自动在布局文件的最外层再嵌套一个FrameLayout,所以layout_width和layout_height属性才会有效果。
那么我们来证实一下吧,在MainActivity加入以下代码:
ViewParent parent = mainLayout.getParent(http://www.amjmh.com);
Log.d("MainActivity", "the parent of mainLayout is" + parent);
1
2
log信息

可以看到,LinearLayout的父布局确实是一个FrameLayout,而这个FrameLayout就是由系统自动帮我们添加上的。

posted @ 2019-09-10 17:23  李艳艳665  阅读(190)  评论(0编辑  收藏  举报