[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,则为其设置默认图片。然后再为输入框显示图片,便获得下图效果:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
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);
} }
[Android]自己定义带删除输入框的更多相关文章
- 35.Android之带删除按钮EditText学习
今天实现Android里自定义带删除功能的EditText,效果如下: 当输入内容时,EditText变为带有一个删除功能按钮的编辑框,如图: 实现代码很简单,直接上代码, 布局文件xml: < ...
- android自己定义TextView
Android控件中的TextView控件仅仅有一个输入框.可是为了用于的操作方便我们应该实现一些功能: 1. 能够直接将内容删除的功能button 2. 可以记录用户曾经输入的数据,同一时候可以将数 ...
- android 自己定义控件
Android自己定义View实现非常easy 继承View,重写构造函数.onDraw.(onMeasure)等函数. 假设自己定义的View须要有自己定义的属性.须要在values下建立attrs ...
- 网络编程之PC版与Android手机版带断点续传的多线程下载
一.多线程下载 多线程下载就是抢占服务器资源 原理:服务器CPU 分配给每条线程的时间片相同,服务器带宽平均分配给每条线程,所以客户端开启的线程越多,就能抢占到更多的服 ...
- Android自己定义DataTimePicker(日期选择器)
Android自己定义DataTimePicker(日期选择器) 笔者有一段时间没有发表关于Android的文章了,关于Android自己定义组件笔者有好几篇想跟大家分享的,后期会记录在博客中.本篇 ...
- 【Android】自带Theme
[Android]自带Theme android之uses-permission 在编写Android程序时经常会忘记添加权限,下面是网上收集的关于Android uses-permission的 ...
- Android SurfaceView实战 带你玩转flabby bird (下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43063331,本文出自:[张鸿洋的博客] 1.概述 在Android Surfa ...
- Android自己定义控件:进度条的四种实现方式
前三种实现方式代码出自: http://stormzhang.com/openandroid/2013/11/15/android-custom-loading/ (源代码下载)http://down ...
- android自己定义开关控件
近日在android项目要使用开关控件.可是android中自带的开关控件不太惬意,所以就打算通过自己定义View写一个开关控件 ios的开关控件当然就是我要仿照的目标. 先上图: waterma ...
随机推荐
- saltstack install on centos7
saltstack offical website reference blog summary install virtualbox yum install VirtualBox-5.2 insta ...
- 苹果平台上的媒体流播放技术HLS
近日在和朋友聊起媒体流的服务器端实时转码技术的时候,发现苹果的各种终端上的视频播放并未使用常见的基于UDP的RTSP/RTP,而强制使用了Http Live Stream技术,这里稍稍总结了如下. 苹 ...
- Angular JavaScript内存溢出问题 (FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory)
方法一和方法二参考:https://www.cnblogs.com/liugang-vip/p/6857595.html 方法一:my-project/node_modules/.bin 下增大内存( ...
- spring注解开发-声明式事务(源码)
1. 环境搭建与测试 1)导入相关依赖 数据源.数据库驱动.Spring-jdbc模块 <dependency> <groupId>org.springframework< ...
- 洛谷 P1708 天然气井 题解
https://www.luogu.org/problemnew/show/P1708 这道题还是比较好的. 读完题目我们先想想如何计算某个天然气井($x_1,y_1$)和中转站($a_1,b_1$) ...
- java指令详解
Java是通过java虚拟机来装载和执行编译文件(class文件)的,java虚拟机通过命令java option 来启动,-option为虚拟机参数,通过这些参数可对虚拟机的运行状态进行调整. 一. ...
- for、while循环
for循环 # for 循环后面可以对Iterable或者Iterator进行遍历 # "abc"和[1,2,3]为可迭代对象,range(4)为迭代器 for i in &quo ...
- python 学习总结1
计算机与程序设计 一.计算机的概念 1.计算机是根据指令操作数据的设备. 2.计算机主要包括两个功能性一个是功能性另一个是计算性 功能性是对数据的操作,表现为数据计算,输入输出处理和结果存储 可编程性 ...
- 洛谷 P3387 【模板】缩点 DAGdp学习记
我们以洛谷P3387 [模板]缩点 来学习DAGdp 1.这道题的流程 //伪代码 for i->n if(i未被遍历) tarjan(i) 缩点() DAGdp() 完成 首先tarjan这部 ...
- bzoj1709 [Usaco2007 Oct]Super Paintball超级弹珠 暴力
[Usaco2007 Oct]Super Paintball超级弹珠 Description 奶牛们最近从著名的奶牛玩具制造商Tycow那里,买了一套仿真版彩弹游戏设备(类乎于真人版CS). Bess ...