0%

Android静态和动态加载布局

静态加载布局

这个就是说,我们有的时候想要复用某个布局里面的内容,就比如说标题啊,结尾啊,这个就像是node.js,foot.js这种感觉,所以我们就要用到include。
include和C++的感觉也有点像,就是包含的这个头。
title.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >

<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="标题" />

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="内容" />

</LinearLayout>

我们先写一个title的xml,然后我们在里面设计好我们的内容。
之后如果我们想要再次用到的话呢,我们可以直接包含:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<include
layout="@layout/title"
/><!-- 静态加载布局,也可以导控件,控件需要是单独的布局文件 -->
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />

</LinearLayout>

这个样子就可以了,然后我们就在头部有了我们写好的title.xml文件。
静态加载
如果我们在这个include节点中配置一些属性,例如宽高的话呢是没有用的,这个要看被加载的XML文件是做了什么的。

动态加载ViewStub

首先我们要先定义XML:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?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" >

<ViewStub
android:id="@+id/viewstub"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout="@layout/title" /><!-- ViewStub中的属性是优先于布局里面的属性的与include是相反的 -->

<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />

<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />

</LinearLayout>

可以看到动态加载的话呢我们是用到ViewStub进行加载的,属性中与include不同的是,include是layout,而动态加载的话呢是:android:layout
而且动态加载中的属性是权限高的,即使title.xml设置了,我们还是遵循ViewStub的规则。
那我们如何动态的加载呢?
看java代码:

1
2
private ViewStub Vs;
private Button btn1;

先声明变量,和普通控件一样,然后我们再初始化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.viewstub);
Vs = (ViewStub) findViewById(R.id.viewstub);
btn1 = (Button) findViewById(R.id.button1);
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
LinearLayout Lv = (LinearLayout) Vs.inflate();//获取加载的布局
//之后我们就不能在通过这个对象调用inflate了,因为这个对象就置为空了
//Vs.setVisibility(View.VISIBLE);

}
});
}

这里我们返回的LinearLayout这个对象是可以操作的,但是有一点要注意了,我们的ViewStub在用过inflate方法之后,这个对象的这个方法是不能再重新调用了的,否则会出错,空布局的错误,因为这个布局我们得到过一次了,反正谷歌是这么说的。当然我们如果不想用inflate方法的话呢我们也还是可以用setVisibility这个方法的,效果是一样的,而且第二次调用还不会出错,设置不可见也是可以的(View.INVISIBLE),但是会占用位置,因为只是不可见,但是布局中还是你有他的位置。
动态加载