android 自定义命名空间,Android自定义组合控件的实现

需求:在黑马做安全卫士的时候,功能9设置中心界面如下:

在点击item的时候,复选框会反转状态,同时"自动更新已经关闭"会变换内容和颜色。

746c6ae45c2ba6863e22c604015f88fc.png

可以发现这个界面类似ListView,但又不是ListView,因为它的item数量是固定的,且最后一

item和之前的都不一样。虽然这个看着像是标准的List结构,实则每个item不是完全一样,因为

每个item的提示文本(如"自动更新已经关闭")的内容并不完全一样。

假如用一般方式来布局的话,4个item就会有3*4 = 12个view,就会有多个findViewById()和

onClick事件。那么程序就会显得十分的臃肿和冗余。

假如用ListView来布局的话,4个item就会有4个view,给item项添加item点击事件即可。但是

上面已经说到,4个item并不是完全标准的ListView的item,每个item项的提示文本内容是独立

的。如果一定要用ListView来实现的话,那么只要多声明两个数组来存放复选框两种状态各个

item的提示信息。虽然ListView也能实现想要的功能,但是有点大材小用的感觉,而且复用性差.

为了解决上面这一问题,于是自定义组合控件的技术出现了。

1.   什么是自定义组合控件

自定义组合控件,还不如说是自定义组合控件类。就是将多个控件封装到一个容器里,将整个容

器看作一个控件。所有的控件还是用代码,用相应的类来实现的。

■自定义组合控件的特点

1) 冗余度低

2)复用性强

2.   自定义组合控件的实现

54f299102df69d9ef5fafb9405cc1768.png

将每个item看作一个自定义组合控件,它应该有title、desc_on、desc_off、check四个属性。

将不同状态的提示文本属性信息封装在控件里,这样比较适于管理和控制。

1)设计自定义控件的布局<?xml  version="1.0" encoding="utf-8"?>

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="#F0F0F0" >

android:id="@+id/tv_title"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_alignParentTop="true"

android:layout_marginLeft="5dp"

android:layout_marginTop="5dp"

android:text="标题"

android:textSize="20dp"

android:textStyle="bold" />

android:id="@+id/tv_desc"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_alignLeft="@id/tv_title"

android:layout_below="@id/tv_title"

android:layout_marginTop="5dp"

android:text="描述"

android:textSize="15dp" />

android:id="@+id/cb_check"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentRight="true"

android:layout_marginRight="5dp"

android:clickable="false"

android:focusable="false" />

布局效果:

90080856757dbd625a52279617762aeb.png

2)创建自定义控件类继承布局

c563c17aa634a268da9f6b0e5f2851ee.png

3)创建项目的自定义命名空间文件

■系统的命名空间

每个布局都要有6638f3dc0f3165ef94990b769eeed865.png ,

其实这个属性指向的是一个系统自带的attr.xml文件,在系统的values文件夹目录下,它指定了什么控件

会有什么属性。

7d5bb714b6165b43a0d018479fe0663b.png

系统自带的这个attr.xml文件里,定义了系统自带的所有控件的属性。

》系统attr.xml文件的根结点标签

ad14e26abe3d4dc16e1757fe70835d1b.png

》比如ImageView控件

c43976fa2201827f5ace0b8f845e33cf.png

控件是用标签来声明的,用标签指定控件的属性。

■自定义的命名空间

》参照系统的自定义命名空间文件的格式,在自己的项目里values文件夹下新建一个

同样名称的attr.xml文件

b224a410a35c9a904a158ba47ca07b68.png

可以在values目录下新建attr.xml文件的时候,会自动提示根标签resources,与

系统自带的attr.xml文件格式一样。

》》在新建的values/attr.xml文件里声明自定义控件及其属性

7b635b65d51fbd6b1e2da0000dae9d16.png

[转]【android】多个类定义attr属性重复的问题:Attribute "xxx" has already been defined

Attribute "title" has already been defined - 姜家志

http://www.880688.com/program/osprojects/programdev/325300.htm

全局搜索包含title的.xml文件,发现V7包中support/v7/appcompat/res/values/attrs.xml中也有title属性。

》》》在activity布局里加上自定义命名空间,引用自定义布局控件。

如果是使用依赖库的自定义属性,包名写本App的包名,而不是依赖库的包名

33a3bbe3607a6756b3373968b090b1ac.png

》》》》自定义控件的初始化

6d1be77ba1ec5df426ec700bd6b284cb.png

上面这种方式获取自定义属性需要对reference和xxx进行判断,否则会发生异常。

另外一种获取自定义属性的方式:TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.RelativeHorizontalItemView);

//得到自定义属性

String leftText = (String) typedArray.getText(R.styleable.RelativeHorizontalItemView_leftText);

自定义控件内部定义的方法:

// 自定义两个事件得到复选框的选中状态和设置它的状态

// 显示

public boolean isCheck() {

return cb_check.isChecked();

}

// 设置

public void setCheck(boolean isChecked) {

cb_check.setChecked(isChecked);

updateCheck();

}

// 更新复选框的状态及配置文件中标记

public void updateCheck() {

if (isCheck()) {

tv_desc.setText(descOnValue);

tv_desc.setTextColor(Color.GREEN);

} else {

tv_desc.setText(descOffValue);

tv_desc.setTextColor(Color.RED);

}

//将状态写入标记

SPUtils.config_SetBooleanValue(getContext(), "autoUpdate", isCheck());

}

在activity里添加自定义控件点击事件,完善逻辑:

//item1监听事件

update_item.setOnClickListener(new MySettingCenterItemView.OnClickListener() {

@Override

public void onClick(View v) {

/*定义自定义控件MySettingCenterItemView的时候,写了两个方法,就是因为不能直接访问它的组合子控件。

通过方法就能获取和设置它的组合子控件的属性值了。*/

update_item.setCheck(!update_item.isCheck());

}

});

拓展:Android中自定义属性(attrs.xml,TypedArray)的使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值