Android自定义EditText右侧带图片控件
作者:炎之铠 发布时间:2023-08-30 03:09:47
标签:Android,EditText,图片控件
前言
最近项目做用户登录模块需要一个右边带图片的EditText,图片可以设置点击效果,所以就查资料做了一个自定义EditText出来,方便以后复用。
原理
下面是自定义EditText的代码,具体难点是要实现图片的点击监听,因为谷歌官方至今没有给出一个直接实现EditText里面图片的监听API。我的做法是整个控件绑定一个OnTouchListener,然后监测点击事件,检测点击位置的X坐标是否在图片的覆盖范围内(下面getCompoundDrawables()[2]里面的2是代表图片在EditText的右边),如果是则执行点击事件。
package scut.userlogin;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.EditText;
/**
* Created by yany on 2016/7/23.
*/
public class EditText_PassWordDisplay extends EditText implements View.OnTouchListener {
//需要实现下面的几个构造函数,不然有可能加载不了这个EditText控件
public EditText_PassWordDisplay(Context context) {
super(context);
init();
}
public EditText_PassWordDisplay(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public EditText_PassWordDisplay(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
//初始化控件,绑定 *
public void init(){
setOnTouchListener(this);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
//如果不是按下操作,就不做处理,如果是按下操作但是没有图片,也不做处理
if (event.getAction() == MotionEvent.ACTION_UP && this.getCompoundDrawables()[2] != null) {
//检测点击区域的X坐标是否在图片范围内
if (event.getX() > this.getWidth()
- this.getPaddingRight()
- this.getCompoundDrawables()[2].getIntrinsicWidth()) {
//在此做图片的点击处理
System.out.println("点击区域");
MessageShow.ShowToast(getContext(), "点击了图片");
}
return false;
}
return false;
}
}
只需要在xml里使用这个控件(记得加上图片,不然的话就相当于一个普通的EditText了):
<?xml version="1.0" encoding="utf-8"?>
<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:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="scut.userlogin.RegisterActivity3">
<scut.userlogin.EditText_PassWordDisplay
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/EditText_PasswordRegisterInput"
android:inputType="textPassword"
android:hint="请输入登录密码"
android:drawableRight="@mipmap/ic_launcher"
android:layout_marginTop="50dp" />
</RelativeLayout>
在Activity里只需要普通地加载就行了:
private EditText_PassWordDisplay et_PasswordRegisterInput;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register3);
init();
}
private void init(){
et_PasswordRegisterInput = (EditText_PassWordDisplay) findViewById(R.id.EditText_PasswordRegisterInput);
}
实现效果,点击图片就会出现Toast:
参考文章:
Android中EditText的drawableRight属性设置点击事件
Android对EditTex的图片实现监听


猜你喜欢
- 在有些需求中会遇到,当鼠标滑过某个UI物体上方时,为了提醒用户该物体是可以交互时,我们需要添加一个动效和提示音。这样可以提高产品的体验感。解
- 下载动画经常出现在下载需求多的app中,比如游戏下载平台,应用市场……先看看效果图:实现private void startAnim() {
- 目录请求参数校验:对于url中的参数对于request body请求体中的参数响应数据格式:全局异常处理统一定义异常响应码,便于查看使用sp
- 本文实例讲述了C#使用round函数四舍五入的方法。分享给大家供大家参考。具体分析如下:C#中的round函数实际上不是真正的四舍五入函数,
- instanceof 严格来说是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例,用法为:boolean result = o
- 一、导论java技术体系中所提到的内存自动化管理归根结底就是内存的分配与回收两个问题,之前已经和大家谈过java回收的相关知识,今天来和大家
- 目录引言什么是Span关于String的一段性能提升测试代码最终性能对比写在最后引言C# 是一门现代化的编程语言,与Java十分的相似。熟练
- 代理模式代理模式(Proxy Pattern)是一种结构性模式。代理模式为一个对象提供了一个替身,以控制对这个对象的访问。即通过代理对象访问
- 简介本文用示例介绍SpringBoot如何向容器注册bean(即:将对象加入容器)。法1:@Component(@Controller/@S
- 效果演示需求和技术分析RecyclerView Item拖拽排序::长按RecyclerView的Item或者触摸Item的某个按钮。Rec
- 一、前言高效、合理的使用hibernate-validator校验框架可以提高程序的可读性,以及减少不必要的代码逻辑。接下来会介绍一下常用一
- 简介同步容器主要分两类,一种是Vector这样的普通类,一种是通过Collections的工厂方法创建的内部类虽然很多人都对同步容器的性能低
- 简介String是我们最常用的一个类,和普通java类一样其对象会存在java堆中。但是String类有其特殊之处,可以通过new方法生成,
- 1.获取屏幕宽高方法1:int screenWidth = getWindowManager().getDefaultDisplay().g
- 1、找准入口,使用ClassPathXmlApplicationContext的构造方法加载配置文件,用于加载classPath下的配置文件
- 在使用springmvc的时候,后台@RequestBody接受的是一个json格式的字符串,一定是一个字符串。我们可以通过@Request
- 首先说说什么叫回调函数?在WINDOWS中,程序员想让系统DLL调用自己编写的一个方法,于是利用DLL当中回调函数(CALLBACK)的接口
- 记录查找自动组拼SQL语句的过程首先在BaseMapper其中的一个方法下打个断点在断点显示的值栏找到相关的SQL发现SQL语句在Mappe
- 前言如果你玩过三国志这种类型的战旗游戏或者模拟城市、部落冲突、海岛奇兵这种模拟经营类的游戏,那么你对网格地图一定不会陌生。在这些游戏中,所有
- 一、着色游戏概述近期群里偶然看到一哥们在群里聊不规则图像填充什么四联通、八联通什么的,就本身好学务实的态度去查阅了相关资料。对于这类着色的资