和我一起实现EditText一键清空功能

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

原地址:简书http://www.jianshu.com/users/cfcd1814672c/latest_articles

在实际项目中我们经常看到这样的效果:
一键清除功能

这就是我们常说的一键清除功能,Android并没有自带的API供我们使用,所以我们需要自己来编写,下面我将介绍常见实现方式.


1.常见的实现方式

目前主要实现的方式有2种:
- EditText和Button的组合:
作者:yayun0516
标题:TextWatcher实现一键清空EditText
CSDN地址:http://blog.csdn.net/yayun0516/article/details/45953347

2种方式的优劣
- 第一种方式:实现的方式简单,容易上手,但是增加了布局的复杂度
- 第二种方式:拓展EditText有一定的难度,可以使用起来会方便很多


2.自定义EditText实现一键清除功能

这里我会基于第二种实现方式一步步实现一键清除的EditText控件,相信你也会选择第二种实现方式吧,毕竟一切为了优化(偷懒)。

步骤1:创建一个控件继承于EditText并实现其构造方法
public class OneKeyClearEditText extends AppCompatEditText {

    public OneKeyClearEditText(Context context) {
        this(context, null);
    }

    public OneKeyClearEditText(Context context, AttributeSet attrs) {
        this(context, attrs, R.attr.editTextStyle);
    }

    public OneKeyClearEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

特别说明:R.attr.editTextStyle是源码中AppCompatEditText,由于使用了AppCompatEditText,所以我们需要依赖V7包,如果没有可以简信我,主题也需要是Theme.AppCompat,我这里为了看的清楚在AndroidManifest.xml中使用的主题是:Theme.AppCompat.Light。

步骤2:利用EditText的CompoundDrawables设置删除图标
private Drawable mClearDrawable;// 一键删除的按钮
private int colorAccent;//获得主题的颜色
@SuppressLint("InlinedApi")
    public OneKeyClearEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray array = context.getTheme()
                .obtainStyledAttributes(new int[] {android.R.attr.colorAccent});
        colorAccent = array.getColor(0, 0xFF00FF);
        array.recycle();
        initClearDrawable(context);
    }

    @SuppressLint("NewApi")
    private void initClearDrawable(Context context) {
        mClearDrawable = getCompoundDrawables()[2];// 获取EditText的DrawableRight,假如没有设置我们就使用默认的图片
        if (mClearDrawable == null) {
            mClearDrawable = getResources().getDrawable(R.drawable.ic_delete_01, context.getTheme());
        }
        DrawableCompat.setTint(mClearDrawable, colorAccent);//设置删除按钮的颜色和TextColor的颜色一致
        mClearDrawable.setBounds(0, 0, (int) getTextSize(), (int) getTextSize());//设置Drawable的宽高和TextSize的大小一致
        setClearIconVisible(true);

    }

    /**
     * 设置清除图标的显示与隐藏,调用setCompoundDrawables为EditText绘制上去
     *
     * @param visible
     */
    private void setClearIconVisible(boolean visible) {
        Drawable right = visible ? mClearDrawable : null;
        setCompoundDrawables(getCompoundDrawables()[0], getCompoundDrawables()[1], right, getCompoundDrawables()[3]);
    }

这一步主要是为了设置删除的图标,图标的颜色和colorAccent颜色一致,大小和TextSize一致,解决适配的问题。

先在布局设置colorAccent为红色

    <!-- Application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
        <item name="colorAccent">#ff0000</item>
    </style>

下面我们看看效果图:
一键清除样式.png
效果还是不错的,到这里基本的UI样式就完成了,目前的控件还只是个“花瓶”,点击的方法还没有实现,接下来我们来实现点击的事件。

步骤3:实现删除图标的点击事件

我们知道Drawable本身没有点击事件,那么怎么办呢?这里从写了onTouch事件,然后模拟点击的区域(图标大小)来现实点击事件:

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        if (mClearDrawable != null && event.getAction() == MotionEvent.ACTION_UP) {
            int x = (int) event.getX();
            // 判断触摸点是否在水平范围内
            boolean isInnerWidth = (x > (getWidth() - getTotalPaddingRight()))
                    && (x < (getWidth() - getPaddingRight()));
            // 获取删除图标的边界,返回一个Rect对象
            Rect rect = mClearDrawable.getBounds();
            // 获取删除图标的高度
            int height = rect.height();
            int y = (int) event.getY();
            // 计算图标底部到控件底部的距离
            int distance = (getHeight() - height) / 2;
            // 判断触摸点是否在竖直范围内(可能会有点误差)
            // 触摸点的纵坐标在distance到(distance+图标自身的高度)之内,则视为点中删除图标
            boolean isInnerHeight = (y > distance) && (y < (distance + height));
            if (isInnerHeight && isInnerWidth) {
                this.setText("");
         Toast.makeText(getContext(), "一键清除", Toast.LENGTH_SHORT).show();//为了看清效果,测试
            }
        }
        return super.onTouchEvent(event);
    }

如果在EditText的范围和图标的范围之类,则表示有效。

下面看看效果:

一键清除.gif

到现在已经实现了一键清除功能了,可是功能还不够完善,我们需要在获取焦点并且有文字内容的时候才显示删除图标,下面继续开始优化。

步骤4: 对获取焦点已经文字输入进行监听优化体验
    private boolean hasFocus;// 控件是否有焦点

    private void initClearDrawable(Context context) {
        ...
        setClearIconVisible(true);
        // 设置焦点改变的监听
        setOnFocusChangeListener(this);
        // 设置输入框里面内容发生改变的监听
        addTextChangedListener(this);

    }
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        this.hasFocus = hasFocus;
        if (hasFocus) {
            setClearIconVisible(getText().length() > 0);
        } else {
            setClearIconVisible(false);
        }

    }
   /**
     * 当输入框里面内容发生变化的时候回调的方法
     */
    @Override
    public void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
        if (hasFocus) {
            setClearIconVisible(text.length() > 0);
        }
    }
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        // TODO Auto-generated method stub

    }

    @Override
    public void afterTextChanged(Editable s) {
        // TODO Auto-generated method stub

    }

基本代码就是这样,在获取焦点和文字输入之前判断是否有文字,从而决定是否显示图标。

* 效果:*

一键删除1.0.gif


3.优化OneKeyClearEditText(一键删除控件)

上面基本是实现了一键清除的功能,对于图标的颜色,有些人可能需要自己定义,这里补充一个方法,

添加自定义属性

        TypedArray array2 = context.obtainStyledAttributes(attrs,R.styleable.OneKeyClearEditText);
        DrawableColor = array2.getColor(R.styleable.OneKeyClearEditText_deletecolor, colorAccent);
        array2.recycle();
                ...     
DrawableCompat.setTint(mClearDrawable, DrawableColor);// 设置删除按钮的颜色和TextColor的颜色一致

values-attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="OneKeyClearEditText">
        <attr name="deletecolor" format="reference|color" />
    </declare-styleable>

</resources>

使用

    <com.yh.clearedittextdemo.view.OneKeyClearEditText
        android:id="@+id/okcet"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:drawableRight="@drawable/ic_delete_03"
        android:hint="请输入手机"
        android:textCursorDrawable="@drawable/cursor"
        app:deletecolor="@android:color/holo_orange_dark" />

最后修改了游标的颜色,下面展示效果:(修改游标颜色:http://www.jianshu.com/p/660e93e1064f
最后样式


4.源码地址

http://download.csdn.net/detail/android_yh/9555816


5.感谢

参考地址:
- 作者:tangqing
标题:自定义View登录注册界面EditText-实现一键清空
地址:http://www.tqcto.com/article/mobile/2899.html
- 作者:wikiday
标题:Android获取Theme的背景颜色
地址:http://blog.csdn.net/wikiday/article/details/8775837


6.总结

核心技术:
- 通过对CompoundDrawables的设置来确定删除图标
- 通过获得系统的Theme来关联删除图标和警告字体的颜色
- 通过DrawableCompat来渲染删除图标
- 通过对onTouch()的监听来模拟点击区域
- 通过对View.OnFocusChangeListener, TextWatcher的监听来优化用户体验

这是EditText系列的第三篇:
EditText(第1章)-游标位置和样式
EditText(第2章)-对hint进行整容

接下来我将实现EditText的密码可见与隐藏的功能。
如有侵权,麻烦简信我,我会及时修改。
如果这篇文章对你有帮助,请点下“喜欢”~

Android进阶之路 - EditText一键清除内容 My God? 因为我们与IOS的不同,当我们需要清空EditText内容时,有时候无法进行清理,故现在才发现很早以前就已经有了处理方式,一种为原生处理,一种为自定义控件。如需在输入完成后显示删除按钮,可监听EditText焦点TextWatch... 阅读详情

相关推荐

Android开发中,实现EditText的键清空内容处理

通过在XML布局文件中定义EditTextButton控件,并在Java代码中设置点击事件监听器,我们可以轻松地实现清空EditText功能。在上述代码中,首先通过findViewById方法找到对应的EditTextButton控件,并将其保存在相应的变量中。在监听器中,通过调用editText的setText方法将其文本内容设为空字符串,从而实现清空EditText功能。当用户在EditText中输入内容后,点击按钮即可清空EditText中的文本内容

ScriptCharm的博客 710

android editText一键清空功能! 详细步骤

有LinearLayout+EditText+ImageView 的组合 也有自己封装实现在xml中使用

weixin_57038660的博客 3077

EditText一键清空内容

俩种方式实现EditText一键清空内容!一种为原生,一种为 网上摘抄的较老自定义控件!We must day day up!!!

edittext去掉_让你的 EditText 全部清除

项目地址(欢迎 Star):ClearEditText在输入文本的时候,通常当前输入的地方的末尾会有一个 'x' 来结束,它的作用是,如果我们想要清空这一整行输入的时候,点一下 'x' 就可以了。它的存在,还是很有必要的。然后,Android UI 组件并没有提供这样的功能,如果 Android 用户在输入了一段很长的文本的时候,发现他完全输错了,这时候想要删除整行内容的话,他必须一直按删除键,或...

weixin_35870524的博客 862

Android自定义EditText带清除功能

首先声明我也是参考了别人的思路,只是稍微做了下修改,增加显示密码与隐藏密码,没有输入字符串时让EditText进行抖动,废话少说这里附上效果图 效果很赞有木有 那么怎么实现这种效果呢?那就跟着我一起来吧 首先我们先分析一下清除功能怎么实现的,我们怎么知道用户点击的是清除按钮还是别的地方呢?,而EditText其实是集成Textview的, 而Textview有方法getTotal...

luhan_cc的博客 700

Android实战简易教程-第三十二枪(自定义View登录注册界面EditText-实现一键清空

自定义View实现登录注册页面的EditText一键清空功能,效果如下: 输入框输入文字后自动出现一键清空键,输入框文字为空时,一键清空键隐藏,下面我们看一下如何通过自定义View实现这一效果。 看一下DeletableEditText.java:package com.example.testview;import android.content.Context; import andro

张亚运的专栏 4549

android自定义带清空内容的TextView

android自定义带清空内容的TextView 代码: /** * 带删除按钮的EditText * @author Administrator * */ public class ClearEditText extends EditText implements OnFocusChangeListener, TextWatcher { /** * 删除按钮的引用 */

小白james 1万+

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

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

Hankkin的博客小园 2052

安卓mysql实现搜索_Android 开源库:手把手教你实现一个简单好用的搜索框

public class EditText_Clear extends android.support.v7.widget.AppCompatEditText {/*** 步骤1:定义左侧搜索图标 & 一键删除图标*/private Drawable clearDrawable,searchDrawable;public EditText_Clear(Context context) {s...

weixin_33228847的博客 225

Android开源实战:手把手教你实现一个简单 & 好用的搜索框(含历史搜索记录)

相信你一定会喜欢上这款简单 & 好用的SearchView控件已在GithubSearchView,欢迎Star!下一篇文章我将继续进行一些有趣的自定义View实例讲解,有兴趣可以继续关注Carson_Ho的安卓开发笔记自定义EditText:手把手教你做一款含一键删除&自定义样式的SuperEditText你也可以自己写一个可爱 & 小资风格的Android加载等待自定义View相信你一定会喜欢上这款简单 & 好用的SearchView控件已在GithubSearchView,欢迎Star!

2401_89693896的博客 1174

带有一键清空功能EditText

介绍  很常见的一个功能,大部分app在登录界面都会实现这个功能了。因为在掘金上看了一篇类似的文章,所以决定自己实践一下。   下图为实现效果:常见实现方法 组合控件,EditText + Button  实现简单,可以单独使用。 自定义View,继承EditText,通过EditText自带的Drawable来实现。  布局复杂度低 继承EditText实现一键功能需要考虑的问题根据业务

Siobhan的专栏 4931

TextWatcher实现一键清空EditText

布局文件main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="ver

张亚运的专栏 3489

Android开发中,使用 EditText 输入内容,如何进行一键清空内容处理

本文仅为个人的处理方式,希望能对您有所帮助,欢迎各位留言指正 1、text.xml示例: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_pare...

Android_JIE的博客 6328

Android Edittext 清空按钮功能实现

1. 布局xml(仅输入框部分,) <LinearLayout android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1.5" android:gravity="bottom" > <TextVie

KeenSpace的专栏 2739

appium实现截图清空EditText

adb 是PC设备连接的桥梁,可以通过adb对devices进行相关操作

m0_70669463的博客 1164

Android开发中,使用 EditText 输入内容实现一键清空内容

本文仅为个人的处理方式,希望能对你有所帮助,欢迎各位留言指正,抱拳了 1、text.xml示例: &amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&amp;gt; &amp;lt;RelativeLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; an

^Being^ 1万+

Android EditText清空按钮&动画

安卓开发中有时经常会用到编辑框(登录、找回密码等场景),但是安卓的EditText竟然不自带清空内容功能,网上找了下资料自定义带清空功能EditText还是比较多的,但是自带明文密文切换的基本没有,所以自己没事干做了一个带点动画效果的自定义EditText

M家杰的博客 8803

android edittext怎么清空,Android开发中,使用 EditText 输入内容,如何进行一键清空内容处理...

本文仅为个人的处理方式,希望能对您有所帮助,欢迎各位留言指正1、text.xml示例:" class="hljs ">xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"android:layout_height="match_parent"android:...

weixin_31018573的博客 2953
上一篇: Android-防止用户快速点击和多控件点击
下一篇: Ali-Check 【Blocker】
Client_Block
博客等级 码龄11年 0粉丝 61原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值