Android自定义控件(2)-阿里云开发者社区

开发者社区> 技术小阿哥> 正文

Android自定义控件(2)

简介:
+关注继续查看

1、设置自定义控件:Android自带的RadioButton只能存放text,这不符合我们的需求,我们需要一个可以同时存放key-value对应的键值。所以我们要编写一个自定义控件能存放key-value。

设计思路:新建一个类叫org.kandy.view.RadioButton,继承自android.wedget.RadioButton,重写父类 的所有构造方法。这样我们就实现了一个跟父类一摸一样的控件。在此基础上加入我们需要的功能:加入一个属性value,用来存放RadioButton的 key。

代码如下:


  1. public class RadioButton extends android.widget.RadioButton {  
  2.  
  3. private String mValue;  
  4.  
  5. public RadioButton(Context context, AttributeSet attrs, int defStyle) {  
  6. super(context, attrs, defStyle);  
  7. }  
  8.  
  9. public String getValue() {  
  10. return this.mValue;  
  11. }  
  12.  
  13. public void setValue(String value) {  
  14. this.mValue = value;  
  15. }  
  16. public RadioButton(Context context, AttributeSet attrs) {  
  17. super(context, attrs);  
  18. try {  
  19. /**  
  20. * 跟values/attrs.xml里面定义的属性绑定  
  21. */  
  22. TypedArray a = context.obtainStyledAttributes(attrs,  
  23. R.styleable.RadioButton);  
  24. this.mValue = a.getString(R.styleable.RadioButton_value);  
  25. a.recycle();  
  26. } catch (Exception e) {  
  27. e.printStackTrace();  
  28. }  
  29.  
  30. }  
  31.  
  32. public RadioButton(Context context) {  
  33. super(context);  
  34. }  
  35.  
  36. }  

红色代码可以先不看。先看我们新加入的属性value,由于Android习惯属性命名以m开头。所以我们自定义控件就按照这个规则来写。不过对于 setter、getter方法来说,不需要加入m。像上面的:属性名称 mValue,setter:setValue(),getter:getValue()。当然,你也可以不按照Android的习惯来命名。

这样,我们就可以使用这个自定义控件了。而且可以给它设置一个value,加上父类的text属性。我们就可以在RadioButton中加入key- value的键值了。当然,这里面的key对应是控件的value属性,value是对应控件的text属性。完了?没有。自定义控件才刚开始了。

 

2、XML中引用自定义控件

在XML中加入自定义控件其实很简单。只需要在控件名字前加入包名即可。如下:


  1. <org.kandy.view.RadioButton android:id="@id/isPayDepositTrue" fsms:value="true" 
  2. android:layout_width="wrap_content" android:layout_height="wrap_content" 
  3. android:text="@string/yes" android:textSize="18sp"> 
  4. </org.kandy.view.RadioButton> 

同样,红色部分可以先不看,也不需要加入到代码中,这个时候加入会报错,请注意。

3、attrs.xml属性定义。

在我们的思想中,既然我在自定义控件中加入了一个新的属性,那么我就应该能够在xml中引用它,并对它赋初始值。我当初也是这样想的。可是却无从下手。就是这一点,折腾了我一个下午。

正解:res/values/attrs.xml中定义属性,在自定义控件中获取这个属性,然后跟自定义控件的属性相绑定。

attrs.xml如果没有,就新建一个。这里只存放自定义控件中需要的属性,在我看来,这个文件是一个中介,负责将layout/xx.xml里面的对这个变量的引用和自定义控件里面的属性绑定起来。

attrs.xml完整代码如下:


  1. <?xml version="1.0" encoding="utf-8"?> 
  2.  <resources> 
  3.  <declare-styleable name="RadioButton"><!– 控件名称–> 
  4.     <attr name="value" format="string"/><!– 属性名称,类型–> 
  5.  </declare-styleable> 
  6.  </resources> 

如果res下没有错误的话,在R中应该就会生成这些资源的id。这样我们就能在自定义控件中引用他们。

这里我们可能对format不是很熟悉,目前Android系统内置的格式类型有integer比如ProgressBar的进度值,float比如 RatingBar的值可能是3.5颗星,boolean比如ToggleButton的是否勾选,string比如TextView的text属性,当 然除了我们常见的基础类型外,Android的属性还有特殊的比如color是用于颜色属性的,可以识别为#FF0000等类型,当然还有 dimension的尺寸类型,比如23dip,15px,18sp的长度单位,还有一种特殊的为reference,一般用于引用@+id/cwj @drawable/xxx这样的类型。

当然什么时候用reference呢? 我们就以定义一个颜色为例子,

<attr name="red" format="color|reference" /> 这里我们用了逻辑或的运算符,定义的红色是颜色类型的,同时可以被引用。

4、控件属性与XML定义绑定。

这下子我们又回到了自定义控件的编写上来了。先看看我们在第一点提到的红色字体部分。这一部分就是实现控件属性与XML定义绑定的代码。


  1. /**  
  2.    * 跟values/attrs.xml里面定义的属性绑定  
  3.   */  
  4.  TypedArray a = context.obtainStyledAttributes(attrs,  
  5.                 R.styleable.RadioButton);  
  6.    this.mValue = a.getString(R.styleable.RadioButton_value);  
  7.    a.recycle(); 

TypedArray其实就是一个存放资源的Array,首先从上下文中获取到R.styleable.RadioButton这个属性资源的资源数组。 attrs是构造函数传进来,应该就是对应attrs.xml文件。 a.getString(R.styleable.RadioButton_value);这句代码就是获取attrs.xml中定义的属性,并将这个属 性的值传给本控件的mValue.最后,返回一个绑定结束的信号给资源:a.recycle();绑定结束。

5、在xml中对控件赋初始值。

请看第2点,绑定结束后可以在需要赋初始值的地方赋值。


  1. <ScrollView android:layout_width="fill_parent" 
  2.  android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" 
  3. xmlns:fsms=http://schemas.android.com/apk/res/org.kandy> 
  4.    
  5.             <org.kandy.view.RadioButton android:id="@id/isPayDepositTrue" fsms:value="true" 
  6.         android:layout_width="wrap_content" android:layout_height="wrap_content" 
  7.         android:text="@string/yes" android:textSize="18sp"> 
  8.        </org.kandy.view.RadioButton> 
  9.    
  10. </ScrollView> 

红色部分首先声明命名空间。命名空间为fsms.路径是http://schemas.android.com/apk/res/这一部分是不变的,后面接的是R的路径:org.kandy.R。然后在自定义控件的xml描述中就可以这样使用fsms:value="true"。这样就实现了自定义控件的初始化赋值。



本文转自 最牛傻蛋 51CTO博客,原文链接:http://blog.51cto.com/zuiniuwang/720102,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android自定义shape的使用
MainActivity如下: package cn.testshape; import android.os.Bundle; import android.
730 0
android 自定义view 缓存技术
在android应用开发过程中,常常涉及到需要自己来重写一个view。一般情况下,只需要重写view中的onDraw方法就能够实现绘制的工作,但是有的时候,涉及到多层且动态的效果的话,不加处理而直接在onDraw中直接绘制的开销会十分大,这种情况下,应用缓存技术就十分有必要了。 缓存技术的原理其实十分简单,就是事先将需要展现的界面全部绘制完成,然后在onDraw里面直接将缓存好的界面展示
1427 0
【Android】Android自定义带board的圆角控件
介绍 圆角控件常用于头像,按钮,图标等,用途十分广泛,而且常常配合board使用。 在IOS中,UIVIew的CALayer层已经提供了圆角和board的方法,所以圆角控件的制作非常简单,只需要类似以下简单代码即可实现: view.layer.cornerRadius = 20; view.layer.borderColor = [UIColor yellow
2266 0
Android使用AttributeSet自定义控件的方法
引用:http://www.cnblogs.com/zwl12549/archive/2011/04/13/2015366.html 所谓自定义控件(或称组件)也就是编写自己的控件类型,而非Android中提供的标准的控件,如TextView,CheckBox等等.
634 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
11130 0
13694
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《Nacos架构&原理》
立即下载
《看见新力量:二》电子书
立即下载
云上自动化运维(CloudOps)白皮书
立即下载