【Android源码解析】 自定义可清除的输入框
2015-08-11 17:16
429 查看
今天给大家分享一下这个关于Edittext,之前用到过要求能一键清除的输入框,想了一下思路,可以在输入框的旁边放一个小的清除图片,然后给Edittext和清除的小图片放到布局中,给布局来一个背景图片,看起来也比较美观的,然后根据edittext.getText().length来设置小图片是否可见,觉得也还行。但是随着自己见得多了就发现这样虽然也能实现,真的很水,所以就想着自定义一个能清除的Edittext。
下面说一下自己的思路:
1.首先自定义组件继承edittext
2.重写构造方法,初始化一个清楚按钮的小图标,并设置它的位置
3.监听edittext的焦点改变,根据焦点变化显示隐藏小图标
4.重写一个小图标的按钮点击事件
贴上部分代码:
然后在我们xml直接引用这个控件就ok了
源码地址:
http://download.csdn.net/detail/lyhhj/8991711
下面说一下自己的思路:
1.首先自定义组件继承edittext
2.重写构造方法,初始化一个清楚按钮的小图标,并设置它的位置
3.监听edittext的焦点改变,根据焦点变化显示隐藏小图标
4.重写一个小图标的按钮点击事件
贴上部分代码:
/** * 这里我们不能设置edittext的点击事件,所以我们可以这样做一下: * 当我们按下的位置 是在(输入框的宽度-图标的宽度-图标距离右侧的宽度)和(输入框的宽度-图标到右侧的宽度)之间 * 也就是说我们按下的位置处于图标的附近,设置输入框 * by Hankkin at:2015年8月11日 16:45:42 * @param event * @return */ @Override public boolean onTouchEvent(MotionEvent event) { if (getCompoundDrawables()[2]!=null){ if (event.getAction() == MotionEvent.ACTION_UP){ boolean touchable = event.getX()>(getWidth()-getPaddingRight()-deleteDraw.getIntrinsicWidth())&& (event.getX() < ((getWidth() - getPaddingRight()))); if (touchable){ setText(""); } } } return super.onTouchEvent(event); }
/** * 设置清除图片是否可见 * by Hankkin at:2015年8月11日 16:17:24 * @param isVisible */ private void setDeleteVisible(boolean isVisible){ Drawable drawable = isVisible?deleteDraw:null; setCompoundDrawables(getCompoundDrawables()[0],getCompoundDrawables()[1],drawable,getCompoundDrawables()[3]); } /** * 根据edittext的焦点变化改变图片的显示与否,输入框里的字符串长度如果大于0,显示,否则隐藏 * by Hankkin at:2015年8月11日 16:32:47 * @param v * @param hasFocus */ @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus){ setDeleteVisible(getText().length()>0); }else { setDeleteVisible(false); } }
然后在我们xml直接引用这个控件就ok了
源码地址:
http://download.csdn.net/detail/lyhhj/8991711
相关文章推荐
- AsyncTask执行顺序
- Android R文件丢失生成失败
- 初入android驱动之字符设备(三)
- 最美应用-从Android研发工程师的角度之[最美时光]
- android媒体--图库与API层MediaPlayer的交互
- Android开发者必知的5个开源库
- android--intent
- Android Unable to instantiate activity ComponentInfo 基本入门 短信 轰炸机 项目 解析
- How to use Genymotion (High performance Android Emulator)
- Android-加速传感器或者OrientationEventListener做横竖屏切换
- android--gradle编译龟速?offline!
- android--handler
- android studio手动加入jar包
- android解析json
- 安卓状态栏通知Notification方法更新(setLatestEventInfo)
- Android多个Activity切换时其生命周期中的方法执行顺序
- Android如何实现点击一次返回键返回桌面而不是退出应用?
- Android Bundle详解
- Android fragment onHiddenChanged方法详解
- Android的View 事件传递