在Android开发中,有时我们需要对默认的UI组件进行自定义以满足特定的设计需求。本案例主要探讨如何自定义一个带有右侧图片的EditText控件,并实现图片的点击事件监听。这在许多场景下都非常实用,例如登录界面中的显示/隐藏密码功能。
创建一个新的Java类,继承自EditText。这里我们命名为`EditText_PassWordDisplay`,并实现`View.OnTouchListener`接口。这是为了能够监听到EditText上的触摸事件,从而判断用户是否点击了图片。
```java
public class EditText_PassWordDisplay extends EditText implements View.OnTouchListener {
// 构造函数和初始化方法略
}
```
在初始化方法`init()`中,我们为EditText设置触摸监听器`setOnTouchListener(this)`。这样,当用户在EditText上进行操作时,会触发`onTouch()`方法。
在`onTouch()`方法中,我们需要处理触摸事件。当事件类型为ACTION_UP(手指抬起)时,检查是否有右侧的图片(通过`getCompoundDrawables()[2]`获取,其中2代表右侧)。如果有图片并且用户点击的位置在图片范围内,就执行相应的点击处理逻辑。这里的逻辑是打印一条日志和显示一个Toast消息:
```java
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP && this.getCompoundDrawables()[2] != null) {
if (event.getX() > this.getWidth() - this.getPaddingRight() - this.getCompoundDrawables()[2].getIntrinsicWidth()) {
System.out.println("点击区域");
MessageShow.ShowToast(getContext(), "点击了图片");
}
return false;
}
return false;
}
```
在XML布局文件中,我们可以像使用普通EditText一样使用这个自定义控件,但需要添加图片资源。通常,图片会被设置为可选的可见性(例如,显示/隐藏密码的图标)。例如:
```xml
<scut.userlogin.EditText_PassWordDisplay
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="密码"
android:inputType="textPassword"
android:drawableRight="@drawable/ic_eye_visible" />
```
这里,`@drawable/ic_eye_visible`是右侧的图片资源,可以通过切换这个资源来改变图片的显示状态,以实现显示或隐藏密码的功能。
总结起来,自定义Android的EditText右侧带图片控件主要是通过重写`onTouch()`方法,监听触摸事件,判断点击位置是否在图片范围内,从而实现图片的点击事件。这样的自定义控件不仅可以用于显示/隐藏密码功能,还可以扩展应用于其他需要在EditText中添加交互元素的场景。通过这样的方式,我们可以使应用的界面更加丰富和交互友好。