在Android的开发中,布局文件可以让我们很方便的对各个UI控件进行界面上的定位和一些属性设置,而在程序中可以直接取得控件的id对它直接进行操作。但是,如果是一个复杂的界面设计,我们把所有布局都放在一个文件中来描述,那这个文件会显得比较臃肿并且结构变得无法清晰了。为此,Android为我们提供了include标签,它可以将已经写好的layout布局文件模块引用到其他的布局文件中。这样的语法可以减少布局文件的臃肿程度,提高布局文件的结构化,使得布局文件简介、结构清晰,提高代码的复用性。
例如:
定义一个布局文件: my_title_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:id="@+id/my_title_parent_id"
android:layout_height="wrap_content" >
<ImageButton
android:id="@+id/back_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" />
<TextView android:id="@+id/title_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="20dp"
android:layout_toRightOf="@+id/back_btn"
android:gravity="center"
android:text="我的title"
android:textSize="18sp" />
</RelativeLayout>
引用这个布局文件的方法:
<?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" >
<include
android:id="@+id/my_title_ly"
android:layout_width="match_parent"
android:layout_height="wrap_content"
layout="@layout/my_title_layout" />
</LinearLayout>
需要注意的问题:
1.如果同一个Anticity的布局文件中引用了相同的多个layout文件,那么使用FindViewById查找子控件的时候需要通过定义两个View来加以区分。也就是说,这时候应该先找到include标签id所对应的View,然后再在View中查找相应的子控件,否则,如果直接查找,系统总是找到的是第一个子控件,而不能找到其他子控件(这时候这些子控件的id都是相同的)。
例如:
btn.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button">
</Button>
</LinearLayout>
main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<include android:id="@+id/in1" layout="@layout/btn"/>
<include android:id="@+id/in2" layout="@layout/btn"/>
<TextView android:id="@+id/tv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
</LinearLayout>
这时候查找id为btn的button需要这么做:
View v1 = (View) findViewById(in1);
Button bt1 = (Button) findViewById(btn);
View v2 = (View) findViewById(in2);
Button bt2 = (Button) findViewById(btn);
如果直接Button bt = (Button)findViewById(btn),则只能找到in1里面的btn。