[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 ...
随机推荐
- pc端移动端兼容的大图轮播
body, html { width: 100%; } * { margin:; padding:; list-style: none; } .haha { list-style-type: none ...
- <Spring Cloud>入门四 Feign
1.Feign 之前使用的是Ribbon+RestTemplate调用,通过的是微服务的名字进行调用,实现负载均衡 但是为了满足接口编程,提供了Feign 2.实现 2.1引入坐标 在 ms-comm ...
- 使用dockerfile构建nginx镜像
使用dockerfile构建nginx镜像 docker构建镜像的方法: commit.dockerfile 1.使用commit来构建镜像: commit是基于原有镜像基础上构建的镜像,使用此方 ...
- Angular 1.x 框架原理
指令生命周期 compile阶段 对dom进行编译,首先(如果有的话)对template进行应用(这个过程只执行一次).然后把当前指令(内部的指令还没被渲染)传递给iElement,接着执行compi ...
- 如何用纯 CSS 创作一个荧光脉冲 loader 特效
效果预览 在线演示 按下右侧的"点击预览"按钮在当前页面预览,点击链接全屏预览. https://codepen.io/zhang-ou/pen/erRzzR 可交互视频教程 此视 ...
- Verilog仿真事件队列
1.分层的事件队列 2.执行事件的队列 3.仿真时间的计算 4.同一层事件,无先后顺序 这个点:觉得Verilog与systemVerilog比较,Verilog比较笼统,systemVerilog则 ...
- POJ 2251-Dungeon Master (三维空间求最短路径)
Description You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is co ...
- p3386 二分图匹配模板
https://www.luogu.org/problemnew/show/P3386 可以只做一边的匹配 #include <bits/stdc++.h> using namespace ...
- Insert or Merge
7-13 Insert or Merge(25 分) According to Wikipedia: Insertion sort iterates, consuming one input elem ...
- 洛谷 P1434 [SHOI2002]滑雪
这道题适合记忆化练手 毕竟总有些大佬虐题. 这个题有几个剪枝 1.记忆化 这个不用多说了吧 剪枝就是 如果 当前点到下面一个点的目前下降的高度+1 小于 下面那个点 能下降的高度 那么反过来,这个点不 ...