{"id":20844904,"url":"https://github.com/mzcretin/clearedittextproject","last_synced_at":"2025-06-23T14:38:05.810Z","repository":{"id":82706987,"uuid":"99825877","full_name":"MZCretin/ClearEditTextProject","owner":"MZCretin","description":"一个三种方式实现的ClearEditText，可清除内容的EditText","archived":false,"fork":false,"pushed_at":"2017-08-23T03:22:44.000Z","size":773,"stargazers_count":26,"open_issues_count":1,"forks_count":7,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-06-05T21:47:22.904Z","etag":null,"topics":["clear","clearedittext"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MZCretin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-08-09T15:48:19.000Z","updated_at":"2024-07-30T09:19:56.000Z","dependencies_parsed_at":null,"dependency_job_id":"a2850288-4d6f-4b0e-a33d-0c3d9ad51c85","html_url":"https://github.com/MZCretin/ClearEditTextProject","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/MZCretin/ClearEditTextProject","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MZCretin%2FClearEditTextProject","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MZCretin%2FClearEditTextProject/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MZCretin%2FClearEditTextProject/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MZCretin%2FClearEditTextProject/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MZCretin","download_url":"https://codeload.github.com/MZCretin/ClearEditTextProject/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MZCretin%2FClearEditTextProject/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261495895,"owners_count":23167392,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clear","clearedittext"],"created_at":"2024-11-18T02:11:25.483Z","updated_at":"2025-06-23T14:38:05.789Z","avatar_url":"https://github.com/MZCretin.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"#ClearEditTextProject\n-------------------\n前两天项目中需要用到带清除按钮的输入框，Android的控件就是不好，都不自带的，看iOS的多好，自带光环……哈哈\n\n不吹牛了，本来是打算找一个的，但是一想也不是很难就自己撸一个。\n\n####效果展示\n\n![image](https://github.com/MZCretin/ClearEditTextProject/blob/master/pic/ezgif.com-video-to-gif.gif)\n\n---------------\n\n我用了三种方式实现了一下这个功能。\n\n**第一种**\n\n直接用ViewGroup包住两个控件，一个EditText，一个ImageView，用代码布局好，然后去监听EditText的输入状态，当EditText内容不为空的时候显示ImageView，在EditText内容为空的时候隐藏ImageView，然后给ImageView添加监听事件，然后清空EditText，这是最简单想到的。下面贴出代码。\n\n这种实现方式，需要分别获取到EditText和ImageView然后分别用Java代码对两者的属性进行设置，修改展示的样式不是很方便。\n\n**第二种**\n\n自定义一个View继承自EditText，然后通过设置setCompoundDrawables(null, null, mClearDrawable, null);来设置右边的图片，然后通过监听onTouchEvent并且通过判断点击的位置判断是否点击到清除按钮来清除EditText的内容与否。\n\n这种实现的方式比上一种实现的方式好的地方在于直接继承自EditText，拥有EditText的所有方法，比较方便修改自定义样式，但是还是又一个明显的缺点，因为内部是使用setCompoundDrawables(null, null, mClearDrawable, null)设置清除按钮的图片，所以使用者在自己使用setCompoundDrawables方法的时候会覆盖原有的逻辑，所以不能使用这个方法。\n\n**第三种（推荐）**\n\n自定义View继承自EditText，然后通过计算View的宽和高，确定右边的删除按钮的大小，在onDraw方法里面，我们会绘制一个删除按钮，按钮的大小由用户控制，我提供一个对外的接口，用于设置删除按钮的缩放大小，默认设置成0.5，也就是说按钮的大小是控件高度的一般，这样做的好处是方便适配所有情况。在安放好删除按钮之后，通过监听onTouchEvent方法监听按钮所在位置范围的点击事件的监听，检测到点击事件并且有文本框内容的时候，就清空文本框的内容。再监听addTextChangedListener，当内容不为空的时候，重绘删除按钮。\n\n这种实现的方式好在不会占用EditText本身的方法，最大化放宽EditText的自定义范围。\n\n-------------\n\n推荐的是第三种方式，所以我打了个library上传上去了，至于其他两种方式，感兴趣的同学可以去clone源码下来试试水！\n\n提供一个简单集成方式：\n\n**Step 1**. Add the JitPack repository to your build file \n\n```\n allprojects {\n        repositories {\n            ...\n            maven { url 'https://jitpack.io' }\n        }\n    }\n```\n\n**Step 2**. Add the dependency\n\n```\ndependencies {\n        compile 'com.github.MZCretin:ClearEditTextProject:1.3.0'\n    }\n```\n\n####有什么意见或者建议欢迎与我交流，觉得不错欢迎Star\n\n使用过程中如果有什么问题或者建议 欢迎在issue中提出来 嘿嘿\n\n**博客地址** http://blog.csdn.net/u010998327/article/details/77104711\n\n####如果您觉得对您有帮助，请打赏我一杯咖啡的钱：\n\n![image](https://github.com/MZCretin/ClearEditTextProject/blob/master/pic/WEIXIN.png)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmzcretin%2Fclearedittextproject","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmzcretin%2Fclearedittextproject","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmzcretin%2Fclearedittextproject/lists"}