Android EditText 响应 drawableRight 等的点击事件

本贴最后更新于 2887 天前,其中的信息可能已经水流花落

我们在输入框 EditText 中,经常会添加比如删除 X,下拉箭头等图标,以得到更好的用户体验和需求,如果放在右边,我们经常设置 drawableRight 属性来实现,那么这些图标如何响应点击事件呢?下面简单记录一下!

方法

首先我们要继承 AppCompatEditText,实现一个自定义的 EditText(现在一般为了兼容和实现 MD 风格,都会继承 AppCompatEditText,而不再去继承 EditText,另外 AS 也会给出相应的错误警告提示!)

然后借助于 onTouchEvent,根据触摸位置来响应图标的点击事件,判断手指抬起的时候的 x,y 坐标是否点击在 drawable 对象上。其中需要搞清楚这几个参数:

event.getRawX()//相对于左边界的绝对坐标,以左上角为(0,0) event.getX()//相对于自身的坐标,以该空间的左上角为(0,0) getLeft()//相当于margin,控件左边界相对于父控件的距离 getPaddingLeft()//相当于padding,控件中元素相对于控件的间距 getBounds().width()//获取元素绘制区域的宽度 drawableRight.getIntrinsicWidth()//获取drawable的实际宽度

那么就需要得到这个图标,这里通过调用 getCompoundDrawables() 可以获取一个长度为 4 的 drawable 数组,存放 drawableLeft,Right,Top,Bottom 四个图片资源对象:

final int DRAWABLE_LEFT = 0; final int DRAWABLE_TOP = 1; final int DRAWABLE_RIGHT = 2; final int DRAWABLE_BOTTOM = 3;
可以根据图标的位置,拿到对应的图片Drawable。 最后,通过声明一个接口,定义一个回调方法,这里就不细说了,比较常见了! public class DropDownEditText extends AppCompatEditText { final int DRAWABLE_LEFT = 0; final int DRAWABLE_TOP = 1; final int DRAWABLE_RIGHT = 2; final int DRAWABLE_BOTTOM = 3; public DropDownEditText(Context context) { super(context); } public DropDownEditText(Context context, AttributeSet attrs) { super(context, attrs); } public interface OnDropArrowClickListener { void onDropArrowClick(); } private OnDropArrowClickListener onDropArrowClickListener; public void setOnDropArrowClickListener(OnDropArrowClickListener onDropArrowClickListener) { this.onDropArrowClickListener = onDropArrowClickListener; } @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { Drawable drawableRight = getCompoundDrawables()[DRAWABLE_RIGHT]; if (drawableRight != null) { //本次点击事件的x轴坐标,如果>当前控件宽度-控件右间距-drawable实际展示大小 if (event.getX() >= (getWidth() - getPaddingRight() - drawableRight.getIntrinsicWidth())) { //设置点击EditText右侧图标EditText失去焦点, // 防止点击EditText右侧图标EditText获得焦点,软键盘弹出 setFocusableInTouchMode(false); setFocusable(false); if (onDropArrowClickListener != null) { onDropArrowClickListener.onDropArrowClick(); } } else { setFocusableInTouchMode(true); setFocusable(true); } } } return super.onTouchEvent(event); } } 示例中展示了图标在右边的情况,同样的其他的位置: **右边:** //另外一种直接的方法 //其实就是算该drawable最左边的x坐标,drawableRight.getIntrinsicWidth()==drawableRight.getBounds().width()等于图标的宽度 event.getRawX() >= (getRight() - drawableRight.getBounds().width()) **左边:** /**getX是相对于控件本身的左上角的x坐标,<= 控件左边距+图片对象实际的宽度.这边的getLeft相当于margin,getPaddingLeft相当于padding*/ event.getX() <= getLeft() + drawableLeft.getIntrinsicWidth() event.getRawX() <= (getLeft() + drawableLeft.getBounds().width()) **上边:** event.getY() <= getTop() + drawableTop.getIntrinsicHeight() **下边:** event.getX() > getHeight() - drawableBottom.getIntrinsicWidth()

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 645 关注
  • Outlook
    1 引用 • 5 回帖 • 5 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 436 关注
  • OneDrive
    2 引用 • 3 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 636 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    209 引用 • 2040 回帖 • 1 关注
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    180 引用 • 3878 回帖
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    108 引用 • 153 回帖
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 404 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 829 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 402 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖 • 1 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 36 关注
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    89 引用 • 1251 回帖 • 395 关注
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1794 回帖 • 1 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖 • 2 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 66 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    336 引用 • 324 回帖
  • 工具

    子曰:“工欲善其事,必先利其器。”

    298 引用 • 763 回帖
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖 • 2 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    86 引用 • 165 回帖
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 677 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    173 引用 • 414 回帖 • 363 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    291 引用 • 4495 回帖 • 661 关注