转载:http://kandy0619.blog.163.com/blog/static/64344345201012325939280/
可能是一直都在做Web的富客户端开发的缘故吧,在接触Android之后,发现其控件实在惨不忍睹(不知道是否说得过于偏激),我所说的惨不忍睹的意思 不是说控件难看,Android的控件非常漂亮,这是我们公司公认的,但是最大的缺点在于控件功能非常弱小。弱小得一个Radio只能放一个text,而 没有value(key)可以存放。这就是为什么我说惨不忍睹的原因。
但是这不能怪google,毕竟才刚刚发展起来,Android提供的只是一个最基本的控件实现,而非一个完整、强大的实现。可幸的是,Android提 供了自定义控件的实现。有了自定义控件,我们就可以再Android的基础控件上实现我们想要的功能了。经过一天的摸索,我终于实现了我第一个自定义的组 合控件——RadioButton组合RadioGroup!
下面我将带领大家进入Android自定义控件的世界。如果觉得我的文章能够帮助大家的话,请大方留下你的一些话语。因为你们的留言是我分享经验的精神源泉!谢谢!
1、设置自定义控件:Android自带的RadioButton只能存放text,这不符合我们的需求,我们需要一个可以同时存放key-value对应的键值。所以我们要编写一个自定义控件能存放key-value。
设计思路:新建一个类叫org.kandy.view.RadioButton,继承自 android.wedget.RadioButton,重写父类的所有构造方法。这样我们就实现了一个跟父类一摸一样的控件。在此基础上加入我们需要的 功能:加入一个属性value,用来存放RadioButton的key。
代码如下:
public class RadioButton extends android.widget.RadioButton {
private String mValue;
public RadioButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); }
public String getValue() { return this.mValue; }
public void setValue(String value) { this.mValue = value; } public RadioButton(Context context, AttributeSet attrs) { super(context, attrs); try { /** * 跟values/attrs.xml里面定义的属性绑定 */ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RadioButton); this.mValue = a.getString(R.styleable.RadioButton_value); a.recycle(); } catch (Exception e) { e.printStackTrace(); }
}
public RadioButton(Context context) { super(context); }
}
|
红色代码可以先不看。先看我们新加入的属性value,由于Android习惯属性命名以m开头。所以我们自定义控件就按照这个规则来写。不过对于 setter、getter方法来说,不需要加入m。像上面的:属性名称 mValue,setter:setValue(),getter:getValue()。当然,你也可以不按照Android的习惯来命名。
这样,我们就可以使用这个自定义控件了。而且可以给它设置一个value,加上父类的text属性。我们就可以在RadioButton中加入key- value的键值了。当然,这里面的key对应是控件的value属性,value是对应控件的text属性。完了?没有。自定义控件才刚开始了。
2、XML中引用自定义控件
在XML中加入自定义控件其实很简单。只需要在控件名字前加入包名即可。如下:
<org.kandy.view.RadioButton android:id="@id/isPayDepositTrue" fsms:value="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/yes" android:textSize="18sp"> </org.kandy.view.RadioButton> |
同样,红色部分可以先不看,也不需要加入到代码中,这个时候加入会报错,请注意。
3、attrs.xml属性定义。
在我们的思想中,既然我在自定义控件中加入了一个新的属性,那么我就应该能够在xml中引用它,并对它赋初始值。我当初也是这样想的。可是却无从下手。就是这一点,折腾了我一个下午。
正解:res/values/attrs.xml中定义属性,在自定义控件中获取这个属性,然后跟自定义控件的属性相绑定。
attrs.xml如果没有,就新建一个。这里只存放自定义控件中需要的属性,在我看来,这个文件是一个中介,负责将layout/xx.xml里面的对这个变量的引用和自定义控件里面的属性绑定起来。
attrs.xml完整代码如下:
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="RadioButton"><!-- 控件名称--> <attr name="value" format="string"/><!-- 属性名称,类型--> </declare-styleable> </resources> |
如果res下没有错误的话,在R中应该就会生成这些资源的id。这样我们就能在自定义控件中引用他们。
4、控件属性与XML定义绑定。
这下子我们又回到了自定义控件的编写上来了。先看看我们在第一点提到的红色字体部分。这一部分就是实现控件属性与XML定义绑定的代码。
/** * 跟values/attrs.xml里面定义的属性绑定 */ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RadioButton); this.mValue = a.getString(R.styleable.RadioButton_value); a.recycle();
|
TypedArray其实就是一个存放资源的Array,首先从上下文中获取到R.styleable.RadioButton这个属性资源的资源数组。 attrs是构造函数传进来,应该就是对应attrs.xml文件。 a.getString(R.styleable.RadioButton_value);这句代码就是获取attrs.xml中定义的属性,并将这个属 性的值传给本控件的mValue.最后,返回一个绑定结束的信号给资源:a.recycle();绑定结束。
5、在xml中对控件赋初始值。
请看第2点,绑定结束后可以在需要赋初始值的地方赋值。
<ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:fsms=http://schemas.android.com/apk/res/org.kandy>
<org.kandy.view.RadioButton android:id="@id/isPayDepositTrue" fsms:value="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/yes" android:textSize="18sp"> </org.kandy.view.RadioButton>
</ScrollView>
|
红色部分首先声明命名空间。命名空间为fsms.路径是http://schemas.android.com/apk/res/这一部分是不变的,后面接的是R的路径:org.kandy.R。然后在自定义控件的xml描述中就可以这样使用fsms:value="true"。这样就实现了自定义控件的初始化赋值。
6、RadioGroup、RadioButton组合控件的实现
上面是自定义控件的实现,下面将要说的是组合控件的实现。在组合控件中,最经常用到的应该就是RadioGroup和RadioButton。 RadioButton的实现已经在上面介绍了。下面要介绍RadioGroup的自定义控件和功能扩展:
代码如下:
public class RadioGroup extends android.widget.RadioGroup {
private String mValue;
public RadioGroup(Context context, AttributeSet attrs) { super(context, attrs); }
public RadioGroup(Context context) { super(context); } // 设置子控件的值 public void setChildValue(){ int n = this.getChildCount(); for(int i=0;i<n;i++){ final RadioButton radio = (RadioButton)this.getChildAt(i); if(radio.getValue().equals(this.mValue)){ radio.setChecked(true); }else{ radio.setChecked(false); } } } // 获取子类的值 public void getChildValue(){ int n = this.getChildCount(); for(int i=0;i<n;i++){ RadioButton radio = (RadioButton)this.getChildAt(i); if(radio.isChecked()){ this.mValue=radio.getValue(); } } }
public void setValue(String value) { this.mValue = value; setChildValue(); }
public String getValue(){ getChildValue(); return this.mValue; } }
|
RadioGroup只做两件事:获取子控件(RadioButton)所选择的值;设置子控件要选择的值。
方法非常简单,循环或者RadioGroup的子控件,检测哪个控件被checked,然后getValue,将此value赋值给RadioGroup的扩展属性value。在这里不多说了。相信大家都能看懂。
分享到:
相关推荐
《Android自定义控件开发入门与实战》这本书深入浅出地讲解了如何在Android平台上创建和使用自定义控件,旨在帮助开发者从基础知识到实战技巧,全方位掌握这一核心技术。 一、自定义控件基础 自定义控件在Android中...
这个压缩包"Android自定义控件源码.rar"包含了一些自定义控件的源代码,虽然不能保证每个都可直接运行,但它们提供了丰富的学习资源,帮助开发者理解和实践自定义控件的创建过程。下面将详细探讨Android自定义控件的...
在Android开发中,自定义控件是提升应用界面独特...通过学习和分析`customcontrols`中的代码,开发者可以深入理解Android自定义控件的工作原理,提高自己的Android开发技能,同时也能为今后的项目开发积累宝贵的经验。
在Android开发中,自定义控件是提升应用独特性和用户体验的有效方式。本教程将引导初学者如何简单地创建一个自定义控件,该控件基于`LinearLayout`进行扩展。通过这个过程,我们可以深入理解Android UI组件的工作...
下面将对"android 自定义控件实现demo收集 及 框架收集"这一主题进行深入探讨。 首先,自定义控件在Android应用开发中扮演着重要角色。它们允许开发者根据项目需求创建具有独特功能和外观的组件,超越了Android SDK...
在Android应用开发中,自定义控件是提升用户体验和界面个性化的重要手段。本文将深入探讨如何实现一个自定义的...不断学习和实践,将帮助你更好地理解和掌握Android自定义控件的精髓,为你的应用带来更丰富的用户体验。
在Android开发中,自定义控件是提升应用独特性和用户体验的重要手段。本教程将通过一个具体的实例——saRoundProgressBarDemo,来教你如何编写一个自定义的圆形进度条控件。这个自定义控件不仅提供了基本的进度显示...
在Android开发中,自定义控件是实现独特用户界面效果的重要手段。本教程将深入探讨如何创建一个自定义控件,让小球沿着圆周进行运动。这个过程涉及到Canvas绘图、动画处理以及Android帧率控制等多个核心知识点。 ...
在Mono for Android中,自定义控件同样可以实现,为开发者提供了极大的灵活性和创造力。 首先,我们需要理解自定义控件的基本步骤: 1. **创建自定义控件类**:在Mono for Android项目中,你可以通过继承已有的...
在Android开发中,自定义...通过学习和实践自定义控件,开发者可以更好地掌控Android界面设计,实现独特的视觉效果和交互体验。"Android 自定义控件实例"提供了具体的实践案例,有助于加深对自定义控件的理解和应用。
总之,实现Android自定义控件的Java代码语法高亮是一项涉及正则表达式、线程管理和UI更新的技术挑战。合理利用现有的开源库,结合Android系统提供的工具,可以构建出功能强大且用户体验良好的自定义EditText控件。在...
在Android开发中,自定义控件是提升应用用户体验和界面设计独特性的重要手段。本教程主要探讨如何通过继承和组合的方式来自定义控件,适用于已经有一定Android基础的开发者进行进阶学习。 首先,我们来理解自定义...
Android自定义控件开发入门与实战从自定义基础到实战的讲解。一步步深入。适合有一定Android基础的读者。本压缩包中自带了推荐的pdf阅读器。大家要是喜欢这本文档,推荐去京东,天猫,当当买支持一下默默付出的作者...
在Android开发中,自定义控件是提升应用用户体验和界面独特性的关键手段。本文将深入探讨如何通过自定义控件实现横向滑动背景图的视差效果,这通常用于模仿真实世界中的深度感知,增强用户的沉浸感。我们将讨论以下...
在Android开发中,自定义控件是提升应用用户体验和实现独特设计的重要手段。...而"【eoeAndroid特刊】第19期:Android自定义控件.pdf"这个文件,应该包含了丰富的实例和详细教程,是深入学习这一主题的好资源。
至此,我们完成了一个简单的Android自定义控件,它能展示图片和文字。然而,自定义控件的能力远不止于此。你可以添加更多的功能,如触摸事件处理、动画效果,甚至动态改变内容。通过深入理解Android的绘图API和布局...
这个压缩包“CustomViews”很可能是包含了一系列Android自定义控件的示例项目,旨在帮助开发者理解和学习如何在Android Studio 1.0.2环境下创建和使用自定义控件。 自定义控件通常涉及以下关键知识点: 1. **...
总结起来,Android自定义组合控件的实现涉及到了对Android UI框架的深入理解和实践,包括继承自定义View或ViewGroup、测量与布局、绘制、事件处理等关键步骤。通过这样的方式,开发者可以构建出功能强大、交互丰富的...
本资源"android自定义控件源码"提供了一套详细的自定义控件实现案例,帮助开发者深入理解自定义控件的工作原理和实现方法。配合文章《Android自定义控件深度解析》(文章地址:...
自定义控件允许开发者根据需求扩展标准Android组件,实现独特的界面效果和交互逻辑。这篇博客将深入探讨如何在Android中创建自定义控件,并提供一些实用技巧。 首先,自定义控件的基本步骤包括: 1. **创建一个新...