我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android输入框控件ClearEditText实现清除功能

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android输入框控件ClearEditText实现清除功能

本文给大家带来一个很实用的小控件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);  
  }  
   
  @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); 
  } 
   
  @Override  
  public void onFocusChange(View v, boolean hasFocus) {  
    this.hasFoucs = hasFocus; 
    if (hasFocus) {  
      setClearIconVisible(getText().length() > 0);  
    } else {  
      setClearIconVisible(false);  
    }  
  }  
   
  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)); 
  } 
   
  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.ClearEditText 
    android: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.ClearEditText 
    android: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> 
  <Button 
    android: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; 
  @Override 
  protected 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() { 
      @Override 
      public void onClick(View v) { 
        if(TextUtils.isEmpty(username.getText())){ 
          //设置晃动 
          username.setShakeAnimation(); 
          //设置提示 
          showToast("用户名不能为空"); 
          return; 
        } 
        if(TextUtils.isEmpty(password.getText())){ 
          password.setShakeAnimation(); 
          showToast("密码不能为空"); 
          return; 
        } 
      } 
    }); 
  } 
   
  private void showToast(String msg){ 
    if(mToast == null){ 
      mToast = Toast.makeText(this, msg, Toast.LENGTH_SHORT); 
    }else{ 
      mToast.setText(msg); 
    } 
    mToast.show(); 
  } 
} 

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

您可能感兴趣的文章:android同时控制EditText输入字符个数和禁止特殊字符输入的方法全面解析Android中对EditText输入实现监听的方法Android文本输入框(EditText)输入密码时显示与隐藏Android之EditText控制禁止输入空格和回车Android如何禁止向EditText控件中输入内容详解Android UI设计系列之自定义EditText实现带清除功能的输入框(3)Android编程实现实时监听EditText文本输入的方法Android高级xml布局之输入框EditText设计Android EditText限制输入字数的方法Android中多个EditText输入效果的解决方式


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android输入框控件ClearEditText实现清除功能

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android输入框控件ClearEditText实现清除功能

本文给大家带来一个很实用的小控件ClearEditText,就是在Android系统的输入框右边加入一个小图标,点击小图标可以清除输入框里面的内容,IOS上面直接设置某个属性就可以实现这一功能,但是Android原生EditText不具备此
2022-06-06

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

记录下一个很实用的小控件EditTextWithDel,就是在Android系统的输入框右边加入一个小图标,点击小图标可以清除输入框里面的内容,由于Android原生EditText不具备此功能,所以要想实现这一功能我们需要重写EditTe
2022-06-06

Android应用中怎么实现一个带清除功能的输入框

本篇文章给大家分享的是有关Android应用中怎么实现一个带清除功能的输入框,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一,自定义一个类,名为ClearEditTextpac
2023-05-31

Android UI设计系列之自定义EditText实现带清除功能的输入框(3)

最近公司的产品在陆续做升级,上级领导给的任务是优化代码结构以及项目架构,力争把项目写的精巧简练,于是我们满工程找冗余... 我们都知道每一个项目基本上都是有登陆页的,在登陆页中肯定是少不了输入框了,当我们在输入框中输入数据后如果输入的内容不
2022-06-06

Android登陆界面实现清除输入框内容和震动效果

本文为大家分享Android登陆界面实现清除输入框内容和震动效果的全部代码,具体内容如下: 效果图:主要代码如下 自定义的一个EditText,用于实现有文字的时候显示可以清楚的按钮:import android.content.Conte
2022-06-06

Android编程实现输入框动态自动提示功能

本文实例讲述了Android编程实现输入框动态自动提示功能。分享给大家供大家参考,具体如下: 关于AutoCompleteTextView的使用,我想大家并不陌生,对其设定上Adapter后系统便能自己识别与匹配了。近期 一个项目中,需要做
2022-06-06

flutter微信聊天输入框功能实现

这篇文章主要介绍了flutter微信聊天输入框功能实现,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-03-02

Android开发中怎么实现一个输入框提示功能

这篇文章给大家介绍Android开发中怎么实现一个输入框提示功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。可以使用cursor来动态加载AutoCompleteTextView的数据,从而 实现时时搜索提示,要实现
2023-05-31

Android 使用<layer-list>实现微信聊天输入框功能

LayerDrawable 标签可是设置LayerDrawable,一种有层次的Drawable叠加效果, 可以包含多个 标签, 每个 代表一个Drawable。<
2023-05-31

flutter微信聊天输入框功能如何实现

这篇文章主要讲解了“flutter微信聊天输入框功能如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“flutter微信聊天输入框功能如何实现”吧!高仿微信聊天输入框,效果图如下(目前都
2023-07-05

Android组件实现列表选择框功能

android提供的列表选择框(Spinner)相当于web端用户注册时的选择下拉框,比如注册候选择省份城市等。如下图便是一个列表选择框下拉列表的列表选择项能够通过xml文件的android:entries属性指定,或是在java代码中导入
2022-06-06

Android如何实现iPhone晃动撤销输入功能

小编给大家分享一下Android如何实现iPhone晃动撤销输入功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!很多程序中我们可能会输入长文本内容,比如短信,写
2023-05-30

Vue3指令之搜索框输入防抖功能实现

在Vue开发中遇到了搜索框输入防抖处理,算是防抖的使用场景之一吧,这篇文章主要给大家介绍了关于Vue3指令之搜索框输入防抖功能实现的相关资料,需要的朋友可以参考下
2022-12-29

Android组合控件实现功能强大的自定义控件

通常情况下,Android实现自定义控件无非三种方式。Ⅰ、继承现有控件,对其控件的功能进行拓展。Ⅱ、将现有控件进行组合,实现功能更加强大控件。Ⅲ、重写View实现全新的控件上文说过了如何继承现有控件来自定义控件:《Android继承现有控件
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录