热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Android实现带有删除按钮的EditText示例代码

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

一、首先来看看效果

这是一个带有删除按钮的输入文本框, 需要新建一个类继承自EditText, 先把代码贴出来, 然后在解释:

示例代码如下:

public class EditTextWithDel extends EditText {

 private final static String TAG = "EditTextWithDel";
 private Drawable imgInable;
 private Context mContext;

 public EditTextWithDel(Context context) {
  this(context, null, 0);
 }

 public EditTextWithDel(Context context, AttributeSet attrs) {
  this(context, attrs, 0);
 }

 public EditTextWithDel(Context context, AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
  mCOntext= context;
  init();
 }

 private void init() {
  imgInable = mContext.getResources().getDrawable(android.R.drawable.ic_delete);
  addTextChangedListener(new TextWatcher() {
   @Override
   public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

   }

   @Override
   public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

   }

   @Override
   public void afterTextChanged(Editable editable) {
    setDrawable();
   }
  });

  setDrawable();
 }

 // 设置删除图片
 private void setDrawable() {
  if (length() <1) {
   setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
  } else {
   setCompoundDrawablesWithIntrinsicBounds(null, null, imgInable, null);
  }
 }

 // 处理删除操作


 @Override
 public boolean onTouchEvent(MotionEvent event) {
  if (imgInable != null && event.getAction() == MotionEvent.ACTION_UP) {
   int eventX = (int) event.getRawX();
   int eventY = (int) event.getRawY();
   Log.d(TAG, "(" + eventX + ", " + eventY + ")");
   Rect rect = new Rect();
   getGlobalVisibleRect(rect);
   rect.left = rect.right - 70;
   Log.d(TAG, rect.toString());
   if (rect.contains(eventX, eventY)) {
    setText("");
   }
  }

  return super.onTouchEvent(event);
 }

 @Override
 protected void finalize() throws Throwable {
  super.finalize();
 }
}

解释如下

首先看一下setCompoundDrawablesWithIntrinsicBounds(Drawable left, Drawable top, Drawable right, Drawable bottom)这个名字贼长的方法, 虽然名字很长, 其实这个方法用起来和简单, 就是设置左上右下的图片, 这个dome只需要设置右边的就行了, 可以看一下全部设置的效果

接着就是还要监听Touch, 这里要说一下getRawX()getX()的区别, getRawX()或者getRawY()方法是以屏幕为参考, getX()getY()方法是以容器为参考, 所以二者得到的值可能不一样. 之后在利用getGlobalVisibleRect()方法得到视图的位置, 存放到rect中, 这里是以屏幕左上角为起点的, 所以前面用的是getRaw方法.

当然也可以 使用getLocalVisibleRect方法, 这个方法是以View的左上角为起点的, 所以用这个方法的话, 就得使用getX()getY()方法来或获取触摸点的x和y值了.

总结

以上就是这篇文章的全部内容了,希望本文的内容对各位Android开发者们能有所帮助,如果有疑问大家可以留言交流。


推荐阅读
  • ServletContext接口在Java Web开发中扮演着重要角色,它提供了一种方式来获取关于整个Web应用程序的信息。通过ServletContext,开发者可以访问初始化参数、共享数据以及应用资源。 ... [详细]
  • 容器与微服务基础:快速入门指南
    探索容器和微服务的基础知识,了解如何通过先进的应用性能管理(APM)工具提升监控效能。加入AppDynamics APM的导览,掌握容器与微服务实施及监控的最佳实践。 ... [详细]
  • 深入理解Docker网络管理
    本文介绍了Docker网络管理的基本概念,包括为什么需要Docker网络管理以及Docker提供的多种网络驱动模式。同时,文章还详细解释了Docker网络相关的命令操作,帮助读者更好地理解和使用Docker网络功能。 ... [详细]
  • Matlab 实现工程与科学问题 - 第三章个人解析
    作为一名在读大学生,本文分享了我对《工程与科学中的Matlab应用》第三章习题的个人解决方案。欢迎通过私信或评论进行交流和讨论,但不接受任何形式的权威指导。文中提供了详细的代码实现,旨在促进学习和共同进步。 ... [详细]
  • 本文档详细介绍了在 Kubernetes 集群中部署 ETCD 数据库的过程,包括实验环境的准备、ETCD 证书的生成及配置、以及集群的启动与健康检查等关键步骤。 ... [详细]
  • 热璞数据库与云宏达成兼容性互认证,共筑数据安全屏障
    热璞数据库与云宏信息技术有限公司近期宣布完成产品兼容性互认证,旨在提升数据安全性与稳定性,支持企业数字化转型。 ... [详细]
  • 本文探讨了使用Filter作为控制器的优势,以及Servlet与Filter之间的主要差异。同时,详细解析了Servlet的工作流程及其生命周期,以及ServletConfig与ServletContext的区别与应用场景。 ... [详细]
  • 前言Git是目前最流行的版本控制系统,在它的基础之上,GitHub和GitLab成为当前最流行的代码托管平台,它们均提供的代码评审、项目管理、持续集成等功能,越来越多的互联网企业都 ... [详细]
  • Flowable 6.6.0 表单引擎在Web应用中的集成与使用
    本文档提供了Flowable 6.6.0版本中表单引擎在Web应用程序中的配置和使用指南,包括表单引擎的初始化、配置以及在Web环境下的具体实现方法。 ... [详细]
  • Eclipse 下 JavaFX 程序开发指南
    本文介绍了 JavaFX,这是一个用于创建富客户端应用程序的 Java 图形和媒体工具包,并详细说明了如何在 Eclipse 环境中配置和开发 JavaFX 应用。 ... [详细]
  • 精通C++并非易事,为何它比其他语言更难掌握?这主要归因于C++的设计理念,即不强迫用户接受特定的编程风格或限制创新思维。本文探讨了如何有效学习C++,并介绍了几本权威的学习资源。 ... [详细]
  • 本文探讨了STL迭代器的最佳实践,包括iterator与const_iterator、reverse_iterator及其const版本之间的关系,以及如何高效地转换和使用这些迭代器类型。 ... [详细]
  • 使用Jenkins构建Java项目实践指南
    本指南详细介绍了如何使用Jenkins构建Java项目,包括环境搭建、工具配置以及项目构建的具体步骤。 ... [详细]
  • 本文将详细介绍Docker的网络架构,包括Docker自带的几种网络模式及其创建方法,探讨容器间及容器与外部世界的通信方式。此外,还将简要介绍单主机环境下的容器网络配置。 ... [详细]
  • 本文旨在介绍在iOS平台进行直播技术开发前的准备工作,重点讲解AVFoundation框架的基本概念和使用方法。通过对AVFoundation的深入理解,开发者能够更好地掌握直播应用中的音视频处理技巧。 ... [详细]
author-avatar
纯洁的老宁同志
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有