Android自定义控件EditText使用详解
本文实例为大家分享了Android自定义控件EditText的具体代码,供大家参考,具体内容如下
自定义控件分三种:
1.自绘控件
2.组合控件
3.继承控件
代码已上传到github
以后的自定义控件就都放这个仓库
需求
这里由于项目的需要实现一个自定义EditText,主要实现的为两点,一个是工具图标toolIcon,例如点击清除EditText内容。一个为EditText左边的提示图标hintIcon,例如输入账号密码时前面的图标。
为了让这个控件的拓展性更高,设置了两个点击事件接口。对于toolIcon来说,默认点击事件为清除EditText内容,如果需要更改,在代码中设设置相关的点击事件即可。
步骤
继承EditText
编写attrs.xml,创建declare-styleable
编写MyEditText
布局中使用
实现
获取布局文件中设置的属性
这里返回的是一个TypedArray数组,获取之后就可以获得布局文件中设置的属性了
privatevoidinit(Contextcontext,AttributeSetattrs){
TypedArraytypedArray=context.getTheme().obtainStyledAttributes(
attrs,
R.styleable.MyEditText,
0,0);
hintIcon=typedArray.getDrawable(R.styleable.MyEditText_hintIcon);
toolIcon=typedArray.getDrawable(R.styleable.MyEditText_toolIcon);
fixed=typedArray.getBoolean(R.styleable.MyEditText_fixed,true);
if(toolIcon!=null&&fixed){
setHeight(toolIcon.getIntrinsicHeight());
}
setCompoundDrawablesWithIntrinsicBounds(hintIcon,null,null,null);
setCompoundDrawablePadding(10);
typedArray.recycle();
onClickListenerWithEditTextToolIcon=newOnClickListenerWithEditTextToolIcon(){
@Override
publicvoidonClick(){
setText("");
}
};
}
设置资源图片
EditText是继承自TextView,在TextView中存在两个方法
setCompoundDrawablesWithIntrinsicBounds(left,top,right,bottom) setCompoundDrawables(left,top,right,bottom)
是设置资源图片的位置,第一个方法和第二个方法的区别在于第一个方法中资源图片的大小是由系统来获取图片固有的大小,第二个方法则是需要自己通过LayoutParams设置大小。
设置点击事件
我们通过setCompoundDrawables()等方法设置的图片,而由于在父类中并没有提供相关的图片点击处理接口,因此可以重写onTouchEvent()来实现相关的点击事件,只需要根据我们手指落点或抬起点的位置就可以判断手指是否点击了相关图片。在这里,我选择了手指抬起时处理
/**
*OverridethetouchEventtojudgewhetherclicktoolIconorhintIcon
*
*@parameventmotionEvent
*@returnsuper
*/
@Override
publicbooleanonTouchEvent(MotionEventevent){
if(event.getAction()==MotionEvent.ACTION_UP){
if(hintIcon!=null){
if(event.getX()0){
if(getCompoundDrawables()[0]!=null
&&onClickListenerWithEditTextHintIcon!=null){
onClickListenerWithEditTextHintIcon.onClick();
}
}
}
if(toolIcon!=null){
if(event.getX()>(getWidth()
-toolIcon.getIntrinsicWidth())
&&event.getX()
完整代码
packagecom.customwidget.lzqwidget.cuswidget;
importandroid.content.Context;
importandroid.content.res.TypedArray;
importandroid.graphics.drawable.Drawable;
importandroid.util.AttributeSet;
importandroid.view.MotionEvent;
importandroid.widget.EditText;
importcom.customwidget.lzqwidget.R;
/**
*CustomwidgetofEditTextwithtwoicon.
*Createdbylizhongquanon16-1-6.
*/
publicclassMyEditTextextendsEditText{
privateDrawablehintIcon=null;
privateDrawabletoolIcon=null;
/**
*HintIconclickListener
*/
privateOnClickListenerWithEditTextHintIcononClickListenerWithEditTextHintIcon=null;
/**
*DefaultcleartheEditText
*/
privateOnClickListenerWithEditTextToolIcononClickListenerWithEditTextToolIcon=null;
/**
*DefaultfixedtheHeight
*/
privatebooleanfixed=true;
publicMyEditText(Contextcontext){
super(context);
}
publicMyEditText(Contextcontext,AttributeSetattrs){
super(context,attrs);
init(context,attrs);
}
publicMyEditText(Contextcontext,AttributeSetattrs,intdefStyleAttr){
super(context,attrs,defStyleAttr);
init(context,attrs);
}
privatevoidinit(Contextcontext,AttributeSetattrs){
TypedArraytypedArray=context.getTheme().obtainStyledAttributes(
attrs,
R.styleable.MyEditText,
0,0);
hintIcon=typedArray.getDrawable(R.styleable.MyEditText_hintIcon);
toolIcon=typedArray.getDrawable(R.styleable.MyEditText_toolIcon);
fixed=typedArray.getBoolean(R.styleable.MyEditText_fixed,true);
if(toolIcon!=null&&fixed){
setHeight(toolIcon.getIntrinsicHeight());
}
setCompoundDrawablesWithIntrinsicBounds(hintIcon,null,null,null);
setCompoundDrawablePadding(10);
typedArray.recycle();
onClickListenerWithEditTextToolIcon=newOnClickListenerWithEditTextToolIcon(){
@Override
publicvoidonClick(){
setText("");
}
};
}
/**
*OverridethetouchEventtojudgewhetherclicktoolIconorhintIcon
*
*@parameventmotionEvent
*@returnsuper
*/
@Override
publicbooleanonTouchEvent(MotionEventevent){
if(event.getAction()==MotionEvent.ACTION_UP){
if(hintIcon!=null){
if(event.getX()0){
if(getCompoundDrawables()[0]!=null
&&onClickListenerWithEditTextHintIcon!=null){
onClickListenerWithEditTextHintIcon.onClick();
}
}
}
if(toolIcon!=null){
if(event.getX()>(getWidth()
-toolIcon.getIntrinsicWidth())
&&event.getX()0&&getCompoundDrawables()[2]==null&&toolIcon!=null){
//hintIcon.setBounds(10,0,10,0);
setCompoundDrawablesWithIntrinsicBounds(hintIcon,null,toolIcon,null);
}
if(text.length()==0&&getCompoundDrawables()[2]!=null&&toolIcon!=null){
setCompoundDrawablesWithIntrinsicBounds(hintIcon,null,null,null);
}
}
/**
*interfacewhenclickhintIcon
*/
publicinterfaceOnClickListenerWithEditTextHintIcon{
voidonClick();
}
/**
*interfacewhenclicktoolIcon
*/
publicinterfaceOnClickListenerWithEditTextToolIcon{
voidonClick();
}
}
attrs.xml:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。