概念:多个零散的控件当成一个控件来看
应用的场景:当我们的应用程序有几个页面,都是出现了相同的布局,这个时候,我们也不想把他抽取成为样式,就可以使用组合式控件来解决问题了.
第一步:
这部分的界面显示的代码,在多个界面重复出现,所以,我们就把他单独写到一个xml文件中,在layout写一个item_setting_view.xml的xml文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<TextView
android:id="@+id/siv_tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginTop="10dp"
android:text="设置自动更新"
android:textSize="18dp" />
<ImageView
android:id="@+id/siv_iv_update"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginTop="10dp"
android:src="@drawable/on" />
RelativeLayout>
第二步:定义一个类去继承上面跟标签(RelativeLayout)
public class SettingItemView extends RelativeLayout {
public SettingItemView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public SettingItemView(Context context, AttributeSet attrs) {
super(context, attrs);
//第三步. 导入布局,把布局加入到容器里面
/*
解释一下:下面这句代码是怎么把,把布局加入到容器里面的.关键就在参数3.
//参数三 写上this : 把这个布局装载到一个容器里面, 也就是装载到当前的这个容器,因为当前的这个类已经继承RelativeLayout(是一个容器) ,所以SettingItemView 也就是一个容器了.
*/
View.inflate(context, R.layout.item_setting_view, this);
}
public SettingItemView(Context context) {
super(context);
}
}
已经定义好了组合式控件,怎么使用呢?
在其他的XMl文件使用组合式控件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
style="@style/TitleBarStyle"
android:text="设置中心" />
<com.itheima.mobilesafe.view.SettingItemView
android:id="@+id/setting_siv_update"
itheima:title="设置"
itheima:bg2="first"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<com.itheima.mobilesafe.view.SettingItemView
itheima:bg2="last"
android:layout_width="match_parent"
itheima:title="骚扰拦截"
android:layout_height="wrap_content" />
LinearLayout>
有很多时候,我们已经定义出来了组合式控件,为了丰富我们控件的功能,我们可以给我
们自己的控件添加自定义属性,比如android:text=”“;这个text就是属性.现在我们就去定义
类似这样的属性
步骤:
1. 在values文件夹下生成一个attrs.xml
2. 在里面声明属性
3. 在布局里面使用属性。
4. 读取属性
5. 给控件赋值
举一个例子:
1. 在values文件夹下生成一个attrs.xml
<resources>
<declare-styleable name="SettingItemView">
//2. 在里面声明属性
<attr name="title" format="string" />
<attr name="bg" format="reference">attr>
<attr name="bg2">
<enum name="first" value="0" />
<enum name="middle" value="1" />
<enum name="last" value="2" />
attr>
declare-styleable>
resources>
对于这个attr.xml文件可能大家对里面的属性,还有类型的定义不是很熟悉.
这个时候,我们可以去翻看源代码.红色圈出来的,是我的电脑找到的attr的路径.
3. 在布局里面使用属性。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:itheima="http://schemas.android.com/apk/res/com.itheima.mobilesafe"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
style="@style/TitleBarStyle"
android:text="设置中心" />
<com.itheima.mobilesafe.view.SettingItemView
android:id="@+id/setting_siv_update"
itheima:title="设置"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<com.itheima.mobilesafe.view.SettingItemView
android:layout_width="match_parent"
itheima:title="骚扰拦截"
android:layout_height="wrap_content" />
LinearLayout>
在第三步的解释
首先需要添加命名的空间:
xmlns:itheima=”http://schemas.android.com/apk/res/com.itheima.mobilesafe”
com.itheima.mobilesafe是指自己的报名
然后在标签里面使用属性
itheima:title=”设置”. itheima:指的是,自己命名空间的前缀
这样设置完之后,还是不行的,因为是自定义的属性,我们还需要4,5步,
才可以把值正确的显示在界面
public class SettingItemView extends RelativeLayout {
public SettingItemView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public SettingItemView(Context context, AttributeSet attrs) {
super(context, attrs);
View.inflate(context, R.layout.item_setting_view, this);
//第四步:读取属性
// 获取属性的集合
//这句代码就是说,要获取到关于这个SettingItemView所以的属性
TypedArray ta = context.obtainStyledAttributes(attrs,
R.styleable.SettingItemView);
// 读取到属性,获取到某一个属性,使用SettingItemView_XX来获取
String title = ta.getString(R.styleable.SettingItemView_title);
// 第五步: 给控件赋值
//R.id.siv_tv_title的这个id,其实就是我们item_setting_view.xml的xml文件中的TextView
//在博文的最上面有设置.晕的朋友可以返回到上面看看
TextView tv = (TextView) findViewById(R.id.siv_tv_title);
tv.setText(title);
}
public SettingItemView(Context context) {
super(context);
}
}