[Android]自己定义带删除输入框

在项目开发中,带删除button输入框也是人们经常常使用到的,该文章便介绍一下怎样创建一个带删除输入框。当中,须要解决的问题例如以下:

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,则为其设置默认图片。然后再为输入框显示图片,便获得下图效果:

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)怎么监听是点击到那个删除图片的呢,这是一个值得思考的问题,在这里,有一种解决方式。那便是触点监听。依据点击的位置来推断是否在图片所处位置的范围内:

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

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

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

	@Override
	protected void onFocusChanged(boolean focused, int direction,
			Rect previouslyFocusedRect) {
		// TODO Auto-generated method stub
		super.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);
	}

	@Override
	protected void onFocusChanged(boolean focused, int direction,
			Rect previouslyFocusedRect) {
		// TODO Auto-generated method stub
		super.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);
		}

		// 将输入框默认设置为没有清除的button
		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

	}

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

}
时间: 2024-10-12 15:51:30

[Android]自己定义带删除输入框的相关文章

35.Android之带删除按钮EditText学习

今天实现Android里自定义带删除功能的EditText,效果如下: 当输入内容时,EditText变为带有一个删除功能按钮的编辑框,如图: 实现代码很简单,直接上代码, 布局文件xml: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 an

Android--&gt;轻松打造带删除按钮的输入框(EditText),附Emoji表情过滤

输入框带删除按钮, 此乃标配, 实现起来方法也很多, 网上开源也很多. 但是, 没事就喜欢瞎折腾. 上图说话. 只是在原生的基础上加了扩展. 相对来说入侵非常少, 使用方法和原生的一模一样.无任何阉割. 完整代码: public class ExEditText extends AppCompatEditText { Rect clearRect = new Rect(); public ExEditText(Context context) { super(context); } public

利用命令行删除Android系统自带应用的方法

一般来说,手机厂家都会在手机中内置许多应用,而这些应用是使用一般的应用程序管理无法删除的.当然,现在有一些APP,如360和豌豆荚,在获取了系统的root权限之后是可以删除自带应用的.但是如果我不想让一个app来获取我的root权限呢?有没有方便.快捷的方法呢? 当然有,那就是利用shell命令.当然,首先要安装当前手机的驱动程序,否则无法进行调试. 在如何删除Android系统中的内置应用一文中作者也介绍了利用命令行删除系统应用的方法,但是个人感觉太麻烦了,其实有更简单的方法,只要三步即可:a

android 自己定义控件

Android自己定义View实现非常easy 继承View,重写构造函数.onDraw.(onMeasure)等函数. 假设自己定义的View须要有自己定义的属性.须要在values下建立attrs.xml. 在当中定义你的属性. 在使用到自己定义View的xml布局文件里须要增加xmlns:前缀="http://schemas.android.com/apk/res/你的应用所在的包路径". 在使用自己定义属性的时候.使用前缀:属性名,如my:textColor="#FF

android自己定义TextView

Android控件中的TextView控件仅仅有一个输入框.可是为了用于的操作方便我们应该实现一些功能: 1. 能够直接将内容删除的功能button 2. 可以记录用户曾经输入的数据,同一时候可以将数据通过下拉显示,点击的时候实现输入 先上图: 下拉的图片没有做.所以和删除的图片使用同一个了,同志们能够直接在xml文件里更换即可了 分析: 肯定要使用自己定义view来实现的.我们知道自己定义view大概能够分为三类:自绘控件,组合控件,继承控件,我们这里是要进行增强的textView的功能.所以

【Android-EditText】自定义带删除功能的EditText

我们经常在一些应用中见到输入框带有删除功能,今天我们就来实现这个功能(文字组织能力不强,大家随便看看).主要是记录一下自己的学习经历,如果对大家有帮助,我会更开心的. 先上图: 实现要点: 1.当输入框为空时,删除按钮隐藏: 2.当输入框不为空时,显示删除按钮. 核心代码: package com.example.view; import com.example.ui.R; import android.content.Context; import android.graphics.Rect;

Android 性能篇 -- 带你领略Android内存泄漏的前世今生

基础了解 什么是内存泄漏? 内存泄漏是当程序不再使用到的内存时,释放内存失败而产生了无用的内存消耗.内存泄漏并不是指物理上的内存消失,这里的内存泄漏是指由程序分配的内存但是由于程序逻辑错误而导致程序失去了对该内存的控制,使得内存浪费. Java 内存分配策略 Java 程序运行时的内存分配策略有三种,分别是 静态分配 . 栈式分配 和 堆式分配 ,对应的三种存储策略使用的内存空间主要分别是 静态存储区(也称方法区) . 栈区 和 堆区 . ?? 静态存储区(方法区):主要存放 静态数据 . 全局

Android自己定义控件皮肤

Android自己定义控件皮肤 对于Android的自带控件,其外观仅仅能说中规中矩,而我们平时所示Android应用中,一个简单的button都做得十分美观.甚至于很多button在按下时的外观都有一定变化,用户体验十分好. 这当中,就涉及到了Android自己定义控件属性的操作方法,下面操作以实现自己定义button皮肤为例. 1. 我们要自己定义将要实现的外观状态.能够是图片或者是自己定义的xml,这是我们直接自己定义不同状态的颜色xml,在values文件夹下新建colors.xml,代

FZU - 2155 - 盟国 (带删除的并查集~~)

Problem 2155 盟国 Accept: 140    Submit: 464 Time Limit: 5000 mSec    Memory Limit : 32768 KB  Problem Description 世界上存在着N个国家,简单起见,编号从0~N-1,假如a国和b国是盟国,b国和c国是盟国,那么a国和c国也是盟国.另外每个国家都有权宣布退盟(注意,退盟后还可以再结盟). 定义下面两个操作: "M X Y" :X国和Y国结盟 "S X" :X国