静态加载布局
这个就是说,我们有的时候想要复用某个布局里面的内容,就比如说标题啊,结尾啊,这个就像是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" /> <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(); } }); }
|
这里我们返回的LinearLayout
这个对象是可以操作的,但是有一点要注意了,我们的ViewStub
在用过inflate
方法之后,这个对象的这个方法是不能再重新调用了的,否则会出错,空布局的错误,因为这个布局我们得到过一次了,反正谷歌是这么说的。当然我们如果不想用inflate
方法的话呢我们也还是可以用setVisibility
这个方法的,效果是一样的,而且第二次调用还不会出错,设置不可见也是可以的(View.INVISIBLE),但是会占用位置,因为只是不可见,但是布局中还是你有他的位置。