创建自定义控件根据控件的需求主要有一下几种方案:
1、如果现有的控件已经具备了你想要的功能,那么修改或者扩展它们的外观或行为。通过override事件处理函数和onDraw,仍然调用父类的方法,在你定制控件时就不需要重新实现它的功能。
2、组合控件来创建原子的、可重用的widgets,它会引发一些相互关联的控件的功能性发生变化。例如,你可以创建一个下拉的combobox,通过组合一个TextView和一个Button,当点击Button时,显示一个浮动的ListView。
3、当你需要一个完全不同的界面,而不能通过改变和组合现有的控件来达到的时候,选择创建一个全新的控件。
CheckableImageButton
Android自带的ImageButton是不支持像CheckBox, RadioButton拥有的check(选中)状态的,Android提供的组件还算丰富,我们能用这些组件快速开发一个简单的应用程序,但在比较复杂项目中就会感觉捉襟见肘了,但幸好在Android系统上开发者能自由定制自己的UI组件,来弥补现有组件的不足。
创建一个CheckableImageButton需要做的工作:
1. 添加资源文件 res/values/attrs.xml,添加自定义组件CheckableImageButton,声明is_checked和personality属性,以后就能通过这两个属性在XML文件中指定相关属性的值。
-
<?xmlversion="1.0"encoding="utf-8"?>
-
<resources>
-
<!--customcheckableimageButton-->
-
<declare-styleablename="CheckableImageButton">
-
<attrname="is_checked"format="boolean"/>
-
<attrname="personality">
-
<enumname="radio"value="0"/>
-
<enumname="check"value="1"/>
-
</attr>
-
</declare-styleable>
-
</resources>
2. 创建ImageButton的背景,使用Selector Drawable。
-
<?xmlversion="1.0"encoding="UTF-8"?>
-
<selectorxmlns:android="http://schemas.android.com/apk/res/android"
-
xmlns:jimi="http://schemas.android.com/apk/res/com.seclock.jimi">
-
<itemandroid:state_pressed="true"android:drawable="@drawable/transparent"/>
-
<itemjimi:is_checked="true"android:drawable="@drawable/checkable_image_btn_state_checked"/>
-
<itemandroid:drawable="@drawable/transparent"/>
-
</selector>
jimi:is_checked="true"是(1)中自定义的属性
3. 创建布局文件,可以指定自定义属性的值。
-
<?xmlversion="1.0"encoding="UTF-8"?>
-
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
-
xmlns:jimi="http://schemas.android.com/apk/res/com.seclock.jimi"
-
android:layout_width="fill_parent"
-
android:layout_height="fill_parent">
-
<you.package.name.CheckableImageButton
-
android:layout_width="fill_parent"
-
android:layout_height="fill_parent"
-
jimi:is_check="true"
-
jimi:personality="radio"
-
/>
-
</LinearLayout>
4. 创建自定义类,继承至ImageButton。让自定义类有ImageButton的所有功能。在构造方法中通过TypedArray读取自定义属性的值。
5. 实现Checkable接口。
接口如下:
-
-
-
-
-
-
voidsetChecked(booleanchecked);
-
-
-
-
booleanisChecked();
-
-
-
-
-
voidtoggle();
自定义类全部代码:
-
publicclassCheckableImageButtonextendsImageButtonimplementsCheckable{
-
privatestaticfinalStringDEBUG_TAG=CheckableImageButton.class
-
.getSimpleName();
-
-
privatestaticfinalintPERSONALITY_RADIO_BUTTON=0;
-
privatestaticfinalintPERSONALITY_CHECK_BUTTON=1;
-
privatestaticfinalint[]CHECKED_STATE_SET={R.attr.checked};
-
-
privatebooleanmChecked;
-
privateintpersonality;
-
privatebooleanmBroadcasting;
-
privateOnCheckedChangeListenermOnCheckedChangeListener;
-
-
publicCheckableImageButton(Contextcontext){
-
super(context);
-
}
-
-
publicCheckableImageButton(Contextcontext,AttributeSetattrs,
-
intdefStyle){
-
super(context,attrs,defStyle);
-
}
-
-
publicCheckableImageButton(Contextcontext,AttributeSetattrs){
-
super(context,attrs);
-
-
TypedArraya=context.obtainStyledAttributes(attrs,
-
R.styleable.checkedImageButton);
-
mChecked=a.getBoolean(R.styleable.checkedImageButton_checked,false);
-
personality=a.getInt(R.styleable.checkedImageButton_personality,
-
PERSONALITY_RADIO_BUTTON);
-
setChecked(mChecked);
-
-
a.recycle();
-
}
-
-
@Override
-
publicbooleanperformClick(){
-
-
if(personality==PERSONALITY_CHECK_BUTTON){
-
toggle();
-
}elseif(personality==PERSONALITY_RADIO_BUTTON){
-
setChecked(true);
-
}
-
returnsuper.performClick();
-
}
-
-
@Override
-
publicvoidsetChecked(booleanchecked){
-
Log.d(DEBUG_TAG,"setChecked:"+checked);
-
if(mChecked!=checked){
-
mChecked=checked;
-
-
refreshDrawableState();
-
}
-
if(mBroadcasting){
-
return;
-
}
-
mBroadcasting=true;
-
if(null!=mOnCheckedChangeListener){
-
mOnCheckedChangeListener.onCheckedChanged(this,mChecked);
-
}
-
mBroadcasting=false;
-
}
-
-
@Override
-
publicbooleanisChecked(){
-
returnmChecked;
-
}
-
-
@Override
-
publicvoidtoggle(){
-
setChecked(!mChecked);
-
}
-
-
@Override
-
publicint[]onCreateDrawableState(intextraSpace){
-
int[]states=super.onCreateDrawableState(extraSpace+1);
-
if(isChecked()){
-
mergeDrawableStates(states,CHECKED_STATE_SET);
-
}
-
returnstates;
-
}
-
-
@Override
-
protectedvoiddrawableStateChanged(){
-
super.drawableStateChanged();
-
-
}
-
-
publicstaticinterfaceOnCheckedChangeListener{
-
-
-
-
-
-
-
-
publicvoidonCheckedChanged(CheckableImageButtonbutton,
-
booleanisChecked);
-
}
-
-
-
-
-
-
staticclassSaveStateextendsBaseSavedState{
-
booleanchecked;
-
-
publicSaveState(Parcelin){
-
super(in);
-
checked=(Boolean)in.readValue(null);
-
}
-
-
publicSaveState(ParcelablesuperState){
-
super(superState);
-
}
-
-
@Override
-
publicvoidwriteToParcel(Parceldest,intflags){
-
super.writeToParcel(dest,flags);
-
dest.writeValue(checked);
-
}
-
-
publicstaticfinalParcelable.Creator<SaveState>CREATOR=newCreator<CheckableImageButton.SaveState>(){
-
-
@Override
-
publicSaveState[]newArray(intsize){
-
returnnewSaveState[size];
-
}
-
-
@Override
-
publicSaveStatecreateFromParcel(Parcelsource){
-
returncreateFromParcel(source);
-
}
-
};
-
}
-
-
@Override
-
protectedParcelableonSaveInstanceState(){
-
ParcelablesuperParcelable=super.onSaveInstanceState();
-
SaveStatess=newSaveState(superParcelable);
-
ss.checked=isChecked();
-
returnss;
-
}
-
-
@Override
-
protectedvoidonRestoreInstanceState(Parcelablestate){
-
SaveStatess=(SaveState)state;
-
super.onRestoreInstanceState(ss.getSuperState());
-
setChecked(ss.checked);
-
}
-
-
publicOnCheckedChangeListenergetmOnCheckedChangeListener(){
-
returnmOnCheckedChangeListener;
-
}
-
-
publicvoidsetmOnCheckedChangeListener(
-
OnCheckedChangeListenermOnCheckedChangeListener){
-
this.mOnCheckedChangeListener=mOnCheckedChangeListener;
-
}
-
-
}
分享到:
相关推荐
通过自定义Checkable控件,来实现点击ListView中的Item来监听其中的cheakbox.体验效果更好
博客《 带checkbox的ListView实现(二)——自定义Checkable控件的实现方法》对应源码,博客地址:http://blog.csdn.net/harvic880925/article/details/40475367
checkable-chip-view,适用于Android的可检查小部件,博客附件,效果请查看博客相对应项目。
CheckableTextView Checkable TextView [KOTLIN]:high_voltage:用Kotlin编写的简单灵活的Checked TextView或Checkable TextView:high_voltage:新增功能CheckableTextView Checkable TextView [KOTLIN]:high_voltage:...
自定义的一个uipickerview,实现可以选择的功能,还是蛮好用的,需要的可以下下来研究下。
AndroidCheckableButton ... 在默认和选定状态下为边框创建两个形状 checkable_default_border.xml <? xml version = " 1.0 " encoding = " utf-8 " ?> < stroke android : width = " 1dp
不过CheckBox的超类CompoundButton实现了Checkable接口,这一点值得借鉴。 下面记录一下遇到的问题,并从源码的角度解决。 问题一: 支持 wrap_content 由于是直接继承自View,wrap_content需要进行特殊处理。 View...
博客《带checkbox的ListView实现(三)——CheckableImageView的实现方法》源码,博客地址:http://blog.csdn.net/harvic880925/article/details/41948211
相当可检查 - Meteor Smart 包 这是一个作为一个流星智能包。 如何使用? 安装 mrt add pretty-checkable
Android的可检查小部件。基于Google I/O 2018应用程序的EventFilterView。
CheckableTextView:简单灵活的Checked TextView或Checkable TextView
或者,通过 Bower 安装: bower install m-checkable ,通过 NPM npm install m-checkable : npm install m-checkable通过 NuGet PM> Install-Package mCheckable 执照 在 MIT 许可下发布 - 由巴兰·米罗斯拉夫...
OneBottomNavigationBar 是自定义的一个实现App应用底部导航栏功能的View,可以实现底部 2-5 个导航菜单(一般不会有更多),可以实现某一个菜单凸起的效果,如,有5个菜单,可以选择让第三个菜单凸起(floating),...
这是由美联储经济数据库(FRED)托管的美联储数据集。FRED有一个数据平台,它们根据数据更新的频率来更新其信息。 TCD.csv TCDSL.csv total-checkable-deposits_...total-checkable-deposits_metadata_1.json
草稿js可检查列表插件 ... yarn add draft-js-checkable-list-plugin用法例子 import React , { Component } from 'react'import { EditorState } from 'draft-js'import Editor from 'draft-js-plugins-editor'import ...
自定义动画、颜色、自定义,使其成为您武器库中的必备组件。 它是高度可配置的,适用于手机和平板电脑。 CheckableView 仅适用于 API 级别 15+,但是,您可以分叉/克隆并修改它。 有关用法和示例,请参见下文。 ...
NULL 博文链接:https://yingzhuo.iteye.com/blog/1740617
QTreeView Checkboxes 需要实现一个功能:在QT的TreeView中,能够使用复选框,并且选中父节点的复选框可以全选或取消子节点的复选框。 参考链接: http://blog.csdn.net/ajaxhe/article/details/7518285
2. 其列表项包含多个checkable的部件,当选择某一行时,该行包含的checkable的部件需要作出相应的变化; 3. 可以选择多个列表项,并且这些列表项可被读出 结果图: 实现: 1. 创建主layout用于规划列表显示。对于...
一个简单灵活的Checked TextView或Checkable TextView