转载请注明出处http://blog.csdn.net/xiaanming/article/details/11066685

今天给大家带来一个很实用的小控件ClearEditText,就是在Android系统的输入框右边加入一个小图标,点击小图标可以清除输入框里面的内容,IOS上面直接设置某个属性就可以实现这一功能,但是Android原生EditText不具备此功能,所以要想实现这一功能我们需要重写EditText,接下来就带大家来实现这一小小的功能

我们知道,我们可以为我们的输入框在上下左右设置图片,所以我们可以利用属性android:drawableRight设置我们的删除小图标,如图

我这里设置了左边和右边的图片,如果我们能为右边的图片设置监听,点击右边的图片清除输入框的内容并隐藏删除图标,这样子这个小功能就迎刃而解了,可是Android并没有给允许我们给右边小图标加监听的功能,这时候你是不是发现这条路走不通呢,其实不是,我们可能模拟点击事件,用输入框的的onTouchEvent()方法来模拟,

当我们触摸抬起(就是ACTION_UP的时候)的范围 大于输入框左侧到清除图标左侧的距离,小与输入框左侧到清除图片右侧的距离,我们则认为是点击清除图片,当然我这里没有考虑竖直方向,只要给清除小图标就上了监听,其他的就都好处理了,我先把代码贴上来,在讲解下

package com.example.clearedittext;import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.view.animation.Animation;
import android.view.animation.CycleInterpolator;
import android.view.animation.TranslateAnimation;
import android.widget.EditText;public class ClearEditText extends EditText implements  OnFocusChangeListener, TextWatcher { /*** 删除按钮的引用*/private Drawable mClearDrawable; /*** 控件是否有焦点*/private boolean hasFoucs;public ClearEditText(Context context) { this(context, null); } public ClearEditText(Context context, AttributeSet attrs) { //这里构造方法也很重要,不加这个很多属性不能再XML里面定义this(context, attrs, android.R.attr.editTextStyle); } public ClearEditText(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);init();}private void init() { //获取EditText的DrawableRight,假如没有设置我们就使用默认的图片mClearDrawable = getCompoundDrawables()[2]; if (mClearDrawable == null) {
//          throw new NullPointerException("You can add drawableRight attribute in XML");mClearDrawable = getResources().getDrawable(R.drawable.delete_selector); } mClearDrawable.setBounds(0, 0, mClearDrawable.getIntrinsicWidth(), mClearDrawable.getIntrinsicHeight()); //默认设置隐藏图标setClearIconVisible(false); //设置焦点改变的监听setOnFocusChangeListener(this); //设置输入框里面内容发生改变的监听addTextChangedListener(this); } /*** 因为我们不能直接给EditText设置点击事件,所以我们用记住我们按下的位置来模拟点击事件* 当我们按下的位置 在  EditText的宽度 - 图标到控件右边的间距 - 图标的宽度  和* EditText的宽度 - 图标到控件右边的间距之间我们就算点击了图标,竖直方向就没有考虑*/@Override public boolean onTouchEvent(MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_UP) {if (getCompoundDrawables()[2] != null) {boolean touchable = event.getX() > (getWidth() - getTotalPaddingRight())&& (event.getX() < ((getWidth() - getPaddingRight())));if (touchable) {this.setText("");}}}return super.onTouchEvent(event);}/*** 当ClearEditText焦点发生变化的时候,判断里面字符串长度设置清除图标的显示与隐藏*/@Override public void onFocusChange(View v, boolean hasFocus) { this.hasFoucs = hasFocus;if (hasFocus) { setClearIconVisible(getText().length() > 0); } else { setClearIconVisible(false); } } /*** 设置清除图标的显示与隐藏,调用setCompoundDrawables为EditText绘制上去* @param visible*/protected void setClearIconVisible(boolean visible) { Drawable right = visible ? mClearDrawable : null; setCompoundDrawables(getCompoundDrawables()[0], getCompoundDrawables()[1], right, getCompoundDrawables()[3]); } /*** 当输入框里面内容发生变化的时候回调的方法*/@Override public void onTextChanged(CharSequence s, int start, int count, int after) { if(hasFoucs){setClearIconVisible(s.length() > 0);}} @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { } /*** 设置晃动动画*/public void setShakeAnimation(){this.setAnimation(shakeAnimation(5));}/*** 晃动动画* @param counts 1秒钟晃动多少下* @return*/public static Animation shakeAnimation(int counts){Animation translateAnimation = new TranslateAnimation(0, 10, 0, 0);translateAnimation.setInterpolator(new CycleInterpolator(counts));translateAnimation.setDuration(1000);return translateAnimation;}}
  • setClearIconVisible()方法,设置隐藏和显示清除图标的方法,我们这里不是调用setVisibility()方法,setVisibility()这个方法是针对View的,我们可以调用setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom)来设置上下左右的图标
  • setOnFocusChangeListener(this)为输入框设置焦点改变监听,如果输入框有焦点,我们判断输入框的值是否为空,为空就隐藏清除图标,否则就显示
  • addTextChangedListener(this)为输入框设置内容改变监听,其实很简单呢,当输入框里面的内容发生改变的时候,我们需要处理显示和隐藏清除小图标,里面的内容长度不为0我们就显示,否是就隐藏,但这个需要输入框有焦点我们才改变显示或者隐藏,为什么要需要焦点,比如我们一个登陆界面,我们保存了用户名和密码,在登陆界面onCreate()的时候,我们把我们保存的密码显示在用户名输入框和密码输入框里面,输入框里面内容发生改变,导致用户名输入框和密码输入框里面的清除小图标都显示了,这显然不是我们想要的效果,所以加了一个是否有焦点的判断
  • setShakeAnimation(),这个方法是输入框左右抖动的方法,之前我在某个应用看到过类似的功能,当用户名错误,输入框就在哪里抖动,感觉挺好玩的,其实主要是用到一个移动动画,然后设置动画的变化率为正弦曲线

接下来我们来使用它,Activity的布局,两个我们自定义的输入框,一个按钮

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#95CAE4"><com.example.clearedittext.ClearEditTextandroid:id="@+id/username"android:layout_marginTop="60dp"android:layout_width="fill_parent"android:background="@drawable/login_edittext_bg" android:drawableLeft="@drawable/icon_user"android:layout_marginLeft="10dip"android:layout_marginRight="10dip"android:singleLine="true"android:drawableRight="@drawable/delete_selector"android:hint="输入用户名"android:layout_height="wrap_content" ></com.example.clearedittext.ClearEditText><com.example.clearedittext.ClearEditTextandroid:id="@+id/password"android:layout_marginLeft="10dip"android:layout_marginRight="10dip"android:layout_marginTop="10dip"android:drawableLeft="@drawable/account_icon"android:hint="输入密码"android:singleLine="true"android:password="true"android:drawableRight="@drawable/delete_selector"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_below="@id/username"android:background="@drawable/login_edittext_bg" ></com.example.clearedittext.ClearEditText><Buttonandroid:id="@+id/login"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginLeft="10dip"android:layout_marginRight="10dip"android:background="@drawable/login_button_bg"android:textSize="18sp"android:textColor="@android:color/white"android:layout_below="@+id/password"android:layout_marginTop="25dp"android:text="登录" /></RelativeLayout>

然后就是界面代码的编写,主要是测试输入框左右晃动而已,比较简单

package com.example.clearedittext;import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;public class MainActivity extends Activity {private Toast mToast;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);final ClearEditText username = (ClearEditText) findViewById(R.id.username);final ClearEditText password = (ClearEditText) findViewById(R.id.password);((Button) findViewById(R.id.login)).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if(TextUtils.isEmpty(username.getText())){//设置晃动username.setShakeAnimation();//设置提示showToast("用户名不能为空");return;}if(TextUtils.isEmpty(password.getText())){password.setShakeAnimation();showToast("密码不能为空");return;}}});}/*** 显示Toast消息* @param msg*/private void showToast(String msg){if(mToast == null){mToast = Toast.makeText(this, msg, Toast.LENGTH_SHORT);}else{mToast.setText(msg);}mToast.show();}}

运行项目,如图,悲剧,没有动画效果,算了就这样子吧,你是不是也想把它加到你的项目当中去呢,赶紧吧!

项目源码,点击下载

Android 带清除功能的输入框控件ClearEditText,仿IOS的输入框相关推荐

  1. android 带清除功能的输入框控件

    今天,看到一个很好的自定义输入框控件,于是记录一下. 效果很好: 一,自定义一个类,名为ClearEditText package com.example.clearedittext;import a ...

  2. Android 带清除功能的输入框控件EditTextWithDel

    记录下一个很实用的小控件EditTextWithDel,就是在Android系统的输入框右边加入一个小图标,点击小图标可以清除输入框里面的内容,由于Android原生EditText不具备此功能,所以 ...

  3. 带搜索功能的GridView控件

    Demo代码下载 最近需要一个gridview能够有不错的搜索功能,最好还是个GridView的扩展控件以后可以直接使用.我试着在CSDN上搜了一下下面这两篇文章都是带Search功能的GridVie ...

  4. android edittext清除功能,Android:带一键清除功能的EditText

    作为一个前端应用开发者,下面这样的场景可以说是屡见不鲜了? 20181218135459.png 当然了,本文所要讲的重点不是如何做一个登录页面,而是输入框后面的那个清除按钮.你可能会说了,这有什么好 ...

  5. 微信小程序基础之input输入框控件

    今天主要详写一下微信小程序中的Input输入框控件,输入框在程序中是最常见的,登录,注册,获取搜索框中的内容等等都需要,同时,还需要设置不同样式的输入框,今天的代码中都要相应的使用. input输入框 ...

  6. 一个自定义的安卓验证码输入框控件、银行卡归属类型查询

    一个自定义的安卓验证码输入框控件.银行卡归属类型查询. GitHub:https://github.com/longer96/VerifyCode Dependency Gradle dependen ...

  7. Android入门(七) | 常用控件

    文章目录 TextView 控件:文本信息 Button 控件:按钮 EditText 控件:输入框 ImageView 控件:图片 ProgressBar 控件:进度条 AlertDialog 控件 ...

  8. Windows Phone 7 自动完成输入框控件AutoCompleteBox

    自动完成输入框控件AutoCompleteBox是一种很常用的控件,它实现了文本框的输入的自动搜索的功能,可以加快用户的输入效率.该控件在微软的Silverlight 开源控件项目"Silv ...

  9. Android设置text按钮,安卓基础控件使用(TextView、Button、ImageView、EditText)

    一.文本控件TextView 1.布局文件 android:text="@string/content" android:layout_width="wrap_conte ...

最新文章

  1. Kotlin数组(Array)
  2. django 数据库迁移注意事项
  3. 小功率荧光灯拆解分析
  4. AWS S3宕机的启发: 云必须分散化
  5. dojo gridx修改表头
  6. 音乐计算机融合课,融合信息技术的音乐课
  7. Python 3.x中reduce()函数完整用法
  8. 根据周次显示日期范围_Elasticsearch根据日期价格范围搜索酒店且排序
  9. 电脑键盘下划线怎么打_电脑键盘失灵鼠标不动怎么办 键盘失灵鼠标不动解决办法...
  10. 看不到日志_迷之 crontab 异常:不运行、不报错、无日志?
  11. 这家初创公司用端到端安全保护物联网设备
  12. 3d打印机 模型图纸下载_如何在3D打印机上制作第一个3D模型
  13. hibernate二级缓存作用、配置
  14. ubuntu 16.04 插入耳机没有声音
  15. ASP.NET Core WebApi返回结果统一包装实践
  16. 【图形学】计算机图形学-练习题7
  17. 没有SEO的DiscuzQ 值不值得站长选择?
  18. NLP自然语言处理之情感分析分析讲解、知识构建
  19. 基于MFC的五子棋设计与实现
  20. ubuntu中搜狗输入法怎么翻页

热门文章

  1. JS---Math.Random()*10--[0,10)随机变颜色
  2. zabbix的trigger
  3. PHP代码重用与函数编写
  4. 关于.NET异步调用的初步总结
  5. 一个基于vue和element-ui的树形穿梭框组件
  6. day_05、内置函数、匿名函数
  7. HTML基础:web前端建站流程
  8. MyBatis使用,MyBatis单独使用笔记
  9. iOS ipv6审核被拒绝的解决方案(已审核通过)
  10. 私有云中Kubernetes Cluster HA方案