android自定义带标题的输入框,[Android]自定义带删除输入框

本文详细介绍了如何在Android开发中创建一个自定义的MyClearEditText控件,集成了删除图片和文本输入的联动功能。通过实现TextWatcher和触摸事件监听,实现了根据输入内容和焦点变化动态显示或隐藏删除图标。适合学习自定义控件及用户界面交互设计。
摘要由CSDN通过智能技术生成

在项目开发中,带删除按钮输入框也是人们常常用到的,该文章便介绍一下如何创建一个带删除输入框。其中,需要解决的问题如下:

a)创建自定义editText类

b)在自定义editText中显示删除图片

c)根据输入框的输入情况显示或隐藏图片

d)点击删除图片文字消失,图片隐藏

e)根据输入框焦点失去和获得状态显示或隐藏图片

好了,问题明确了,开始实现功能:

a)创建一个名为MyClearEditText的class文件,并集成EditText,实现其构造方法:

public MyClearEditText(Context context) {this(context, null);// TODO Auto-generated constructor stub}public MyClearEditText(Context context, AttributeSet attrs) {this(context, attrs, android.R.attr.editTextStyle);// TODO Auto-generated constructor stub}public MyClearEditText(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}ok,第一个问题解决了,进入第二步。

b)在editText中,我们若想显示上下左右方向的图片,有着setCompoundDrawables或setCompoundDrawablesWithIntrinsicBounds方法,具体的话,可以去百度一下其区别,在这里,我使用的是setCompoundDrawablesWithIntrinsicBounds方法。代码如下:

/** * 初始化清除的图片 */private void initClearDrawable() {draw = getCompoundDrawables()[2];// 判断清除的图片是否为空if (draw == null) {draw = getResources().getDrawable(R.drawable.editdelete);}// 为输入框设置图片this.setCompoundDrawablesWithIntrinsicBounds(null, null, draw, null);}思路为:先找到editText中右边的图片,若为null,则为其设置默认图片,然后再为输入框显示图片,便获得下图效果:

97314211_1.png

c)需要获得输入框的情况,便要实现TextWatcher接口。

监听:

this.addTextChangedListener(this);

需要实现的方法:

public void onTextChanged(CharSequence text, int start, int lengthBefore,int lengthAfter) {// 判断输入框中是否有内容if (text.length() > 0) {this.setCompoundDrawablesWithIntrinsicBounds(null, null, draw, null);} else {this.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);}}public void beforeTextChanged(CharSequence s, int start, int count,int after) {// TODO Auto-generated method stub}public void afterTextChanged(Editable s) {// TODO Auto-generated method stub}

d)怎么监听是点击到那个删除图片的呢,这是一个值得思考的问题,在这里,有一种解决方案,那便是触点监听,根据点击的位置来判断是否在图片所处位置的范围内:

@Overridepublic boolean onTouchEvent(MotionEvent event) {// 判断触碰是否结束if (event.getAction() == MotionEvent.ACTION_UP) {// 判断所触碰的位置是否为清除的按钮if (event.getX() > (getWidth() - getTotalPaddingRight())&& event.getX() < (getWidth() - getPaddingRight())) {// 将editText里面的内容清除setText();}}return super.onTouchEvent(event);}

实现以上步骤后,大致的自定义删除输入框功能便可以实现了,但是还是有些问题,假如有两个输入框,当向其中一个输入框输入文字后,点击另外一个输入框,上一个输入框还是会显示删除图片,解决方法如下:

e)既然是根据焦点的得失来判断,当然是实现焦点监听的方法:

@Overrideprotected void onFocusChanged(boolean focused, int direction,Rect previouslyFocusedRect) {// TODO Auto-generated method stubsuper.onFocusChanged(focused, direction, previouslyFocusedRect);// 判断焦点失去和得到时的操作if (focused && !this.getText().toString().equals()) {this.setCompoundDrawablesWithIntrinsicBounds(null, null, draw, null);} else {this.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);}}

ok,完整版的自定义带删除输入框就完全实现了。为方便大家学习,以下为完整代码:

package com.xiaoyan.xiaoyanlibrary.common.widget.edittext;import com.xiaoyan.xiaoyanlibrary.R;import android.content.Context;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.text.Editable;import android.text.TextWatcher;import android.util.AttributeSet;import android.view.MotionEvent;import android.widget.EditText;/** * 自定义一个具有清除功能的editText * * @author xiejinxiong * */public class MyClearEditText extends EditText implements TextWatcher {/** 储存清除的图片 */private Drawable draw;public MyClearEditText(Context context) {this(context, null);// TODO Auto-generated constructor stub}public MyClearEditText(Context context, AttributeSet attrs) {this(context, attrs, android.R.attr.editTextStyle);// TODO Auto-generated constructor stub}public MyClearEditText(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);initClearDrawable();this.addTextChangedListener(this);}@Overrideprotected void onFocusChanged(boolean focused, int direction,Rect previouslyFocusedRect) {// TODO Auto-generated method stubsuper.onFocusChanged(focused, direction, previouslyFocusedRect);// 判断焦点失去和得到时的操作if (focused && !this.getText().toString().equals()) {this.setCompoundDrawablesWithIntrinsicBounds(null, null, draw, null);} else {this.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);}}/** * 初始化清除的图片 */private void initClearDrawable() {draw = getCompoundDrawables()[2];// 判断清除的图片是否为空if (draw == null) {draw = getResources().getDrawable(R.drawable.editdelete);}// 将输入框默认设置为没有清除的按钮this.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);}public void onTextChanged(CharSequence text, int start, int lengthBefore,int lengthAfter) {// 判断输入框中是否有内容if (text.length() > 0) {this.setCompoundDrawablesWithIntrinsicBounds(null, null, draw, null);} else {this.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);}}public void beforeTextChanged(CharSequence s, int start, int count,int after) {// TODO Auto-generated method stub}public void afterTextChanged(Editable s) {// TODO Auto-generated method stub}@Overridepublic boolean onTouchEvent(MotionEvent event) {// 判断触碰是否结束if (event.getAction() == MotionEvent.ACTION_UP) {// 判断所触碰的位置是否为清除的按钮if (event.getX() > (getWidth() - getTotalPaddingRight())&& event.getX() < (getWidth() - getPaddingRight())) {// 将editText里面的内容清除setText();}}return super.onTouchEvent(event);}}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值