【Android源码解析】 自定义可清除的输入框

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/47417337

今天给大家分享一下这个关于Edittext,之前用到过要求能一键清除的输入框,想了一下思路,可以在输入框的旁边放一个小的清除图片,然后给Edittext和清除的小图片放到布局中,给布局来一个背景图片,看起来也比较美观的,然后根据edittext.getText().length来设置小图片是否可见,觉得也还行。但是随着自己见得多了就发现这样虽然也能实现,真的很水,所以就想着自定义一个能清除的Edittext。

下面说一下自己的思路:

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了

github地址:

https://github.com/Hankkin/ClearEditTextDemo.git

源码地址:

http://download.csdn.net/detail/lyhhj/8991711

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏欧阳大哥的轮子

Android中的视图焦点Focus的详细介绍

在非触摸屏设备中接收事件和处理响应的控件是具有焦点(Focused)的控件。一个窗口中一个时间内只能有一个具有焦点的控件。在早期具有滚轮设备的android系统...

18320
来自专栏吾爱乐享

php学习之css小结1

18330
来自专栏前端儿

常见的几种 CSS 水平垂直居中解决办法

用CSS实现元素的水平居中,比较简单,可以设置text-align center,或者设置 margin-left:auto; margin-right:aut...

17210
来自专栏HTML5学堂

2016.06 第三周 群问题分享

HTML+CSS 怎么让一个容器里面不管存在2个子元素还是1个子元素都能垂直居中 2016.06.20~2016.06.24 核心内容 弹性布局 参考答案 实例...

31490
来自专栏项勇

笔记50 | Android自定义View(一)

32640
来自专栏静默虚空的博客

HTML 简介

HTML 简介 超文本标记语言  (Hypertext Markup Language, HTML)  是一个可以用来结构化你的Web内容并给予其含义和目标的...

23690
来自专栏李蔚蓬的专栏

3.6 自定义View (3.6.1)

Android给我们提供了丰富的组件库来创建丰富的UI效果,同时也提供了非常方便的拓展方法。通过继承Android的系统组件,我们可以非常方便地拓展现有功能,在...

11220
来自专栏企鹅号快讯

css层叠样式表

CSS概述 CSS(Cascading Style Sheets的缩写),翻译为“层叠样式表”或者“级联样式表”,简称样式表 主要作用 为了让网页元素的样式更加...

440110
来自专栏编程

CSS布局之垂直居中一

CSS中的水平居中是非常容易实现的,比如对于行内元素,将它的父级元素设置text-align为center既可。 ? 对于块级元素,设置它的margin:aut...

20670
来自专栏Android小菜鸡

初识MarkDown

而在 Markdown 中,只需要在文本前面加上“#” 即可,同理、你还可以增加二级标题、三级标题、四级标题、五级标题和六级标题,总共六级,只需要增加 “#” ...

9510

扫码关注云+社区

领取腾讯云代金券