Android Studio EditText点击图标清除文本内容的实例解析

这篇文章是继自定义EditText样式之后的功能强化,对于实际应用项目有很大的参考意见,感兴趣的朋友可以移步上一篇,”Android Studion自定义EditText样式”.具体清除EditText文本内容功能代码如下:

package com.liheng;
import android.content.Context;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v4.content.ContextCompat;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.EditText;
import myself.myapplication.R;
/**
* 第一步:
* 创建一个类,并继承EditText这个类,实现父类的三个构造函数
* 我们只用实现带一个参数,两个参数,三个参数的构造函数,带四个参数的暂且不管
*/
public class MyEditText extends EditText {
/**
* 第二步:
* 声明3个变量: 两个图片对象(变量的值是通过实例化对象得到的,
* 在JAVA世界里,除了基本数据类型和静态成员不是对象外,
* 其他一切都是对象.类也是一个对象,类是Class类的对象,图片是drawable类的对象)
* 1.当EditText文本内容为空的时候,右侧清空图标应为灰色,此时点击是没有任何效果的
* 2.当EditText文本内容不为空的时候,右侧清空图标应为蓝色,此时点击,清空EditText文本内容
* 3.上下文对象
*/
private Drawable imageBlue;
private Drawable imageGray;
private Context myContext;
/**
* 实现EditText父类的三个构造方法
* 这三个方法必须调用自定义的初始化函数 init()方法
*/
public MyEditText(Context context) {
super(context);
init(context);
}
public MyEditText(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public MyEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
/**
* 初始化方法:用于初始化声明的三个全局变量 :imageBlue,imageGray,myContext
* 并负责监听EditText文本内容的更改
*/
private void init(Context context){
this.myContext = context;
/**
* 得到图片资源:
* 第一种方式:(已过时,不推荐使用,
* 还应注意R文件导入的包应为自己项目下的包,
* 因为图片资源在自己项目目录下):
* imageBlue = myContext.getResources().getDrawable(R.drawable.delete);
*
* 第二种方式:(网友推荐,项目会报错?)
* 调用getDrawable()带两个参数的方法.第二参数置为null
* imageBlue = myContext.getResources().getDrawable(R.drawable.delete, null);
*
* 第三种方式:(谷歌官方推荐使用) ,myContext为自己声明的上下文对象
* imageBlue = ContextCompat.getDrawable(myContext, R.drawable.delete);
*/
imageBlue = ContextCompat.getDrawable(myContext, R.drawable.delete);
imageGray = ContextCompat.getDrawable(myContext, R.drawable.delete_gray);
/**
* 设置文字监听器(EditText文本内容改变时,会触发对应的回调函数)
* onTextChanged() EditText文本内容更改时触发
* beforeTextChanged() EditText文本内容更改前触发
* afterTextChanged() EditText文本内容更改后触发
*
* 对于此项目,清空EditText应在EditText文本内容更改后触发
*
*/
addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
//文字改变后设置清空图片的位置
setImage();
}
});
//初始的时候也应设置清空图片的位置
setImage();
}
/**
* 设置图片位置方法
* 当length()大于0,即 EditText里面有文本内容的时候,图片为蓝色
* 当 length()小于0,即 EditText里面没有文本内容的时候,图片为灰色
* setCompoundDrawablesWithIntrinsicBounds() 四个参数代表左上右下
*/
private void setImage(){
if (length()>0) {
setCompoundDrawablesWithIntrinsicBounds(null,null,imageBlue,null);
}else{
setCompoundDrawablesWithIntrinsicBounds(null, null, imageGray, null);
}
}
public boolean onTouchEvent(MotionEvent event){
switch (event.getAction()){
//匹配手指离开EditText
case MotionEvent.ACTION_UP:
//得到手指离开EditText时的X Y坐标
int x = (int) event.getRawX();
int y = (int) event.getRawY();
//创建一个长方形
Rect rect = new Rect();
//让长方形的宽等于edittext的宽,让长方形的高等于edittext的高
getGlobalVisibleRect(rect);
//把长方形缩短至右边50个宽度内
rect.left = rect.right - 50;
//如果x和y坐标在长方形当中,说明你点击了右边的xx图片,清空输入框
if(rect.contains(x,y)){
setText("");
}
break;
default:
break;
}
return super.onTouchEvent(event);
}
}

自定义的MyEditText这个类实际跟我们在layout布局文件里面拖的EditText控件是一样的,因为MyEditText继承自父类EditText.只不过我们在layout布局文件里面调用的时候应包括完整包名,如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
android:layout_width="match_parent" android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="myself.myapplication.MainActivity">
<com.liheng.MyEditText
android:layout_width="500dp"
android:layout_height="50dp"
android:inputType="textPersonName"
android:text="Name"
android:ems="10"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginLeft="45dp"
android:layout_marginStart="45dp"
android:layout_marginTop="49dp"
android:id="@+id/editText"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:background="@drawable/select_edittext"/>
<com.liheng.MyEditText
android:layout_width="500dp"
android:layout_height="50dp"
android:inputType="textPersonName"
android:text="Name"
android:ems="10"
android:layout_below="@+id/editText"
android:layout_alignLeft="@+id/editText"
android:layout_alignStart="@+id/editText"
android:layout_marginTop="89dp"
android:id="@+id/editText2"
android:paddingLeft="10dp"
android:background="@drawable/select_edittext"/>
</RelativeLayout>

附上实际效果图:

仔细观察可以发现,第一个输入框的清空图标往左靠了一点,这是因为我在第一个输入框的xml布局文件里面加了 android:paddingRight=”10dp” 这一行代码.如此一来,对于清空图标的位置,我们可以根据手机分辨率大小做具体调整.

图标素材:


以上所述是小编给大家介绍的Android Studio EditText点击图标清除文本内容,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Android studio中生成引用.aar和.jar的方法详解

    在Android Studio中对一个自己库进行生成操作时将会同时生成*.jar与*.aar文件. 分别存储位置: *.jar:库 /build/intermediates/bundles/debug(release)/classes.jar *.aar:库 /build/outputs/aar/libraryname.aar .jar 与 .aar的区别 从名称上来讲,一个是java application resource:一个是android application resource: 那

  • Ubuntu16.04 LTS 下安装 Android Studio 2.2.2 的详细步骤

    下载 Android SDK,官网:www.android.com我相信很多人跟我一样,进不去.Android Studio 中文官网 www.android-studio.org 进去下载, 在终端解压到想安装SDK的目录(设SDK目录为 $ASDK_HOME )即安装完成. 进入目录 $ASDK_HOME/tools/,终端运行命令 ./android 进入 SDK Manager. 通过这个软件,可以选择下载相关的开发包,有不同版本的 SDK 及其源码文档等,注意:必须下载 Extras

  • Android studio 出现错误Run with --stacktrace option to get the stack trace. Run with --info or --debu

     Android studio Run with --stacktrace option to get the stack trace. Run with --info or --debu 提示信息 Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. 其实是让你去查看更多的log信息.找到你项目的根目录,比如你的项目是MyApp

  • Android 详解Studio引用Library与导入jar

    在Android项目开发过程中,Android Studio是一款非常强大的开发工具.到底有多强大,用了你就知道了. 本文我将介绍Studio引用Library开源项目与导入jar方法. 一.引用Library 1:选择你的项目,点击导航栏File -->New -->Import Module... 根据提示Import你的Library即可 此时展开你的项目即可发现你导入的Library(我导入的是IOS_Dialog_Library) 到这工作还未结束. 2:再次选择你的项目,点击Fil

  • 使用Android Studio检测内存泄露(LeakCanary)

    内存泄露,是Android开发者最头疼的事.可能一处小小的内存泄露,都可能是毁千里之堤的蚁穴. 怎么才能检测内存泄露呢? AndroidStudio 中Memory控件台(显示器)提供了一个内存监视器.我们可以通过它方便地查看应用程序的性能和内存使用情况,从而也就可以找到需要释放对象,查找内存泄漏等. 熟悉Memory界面 打开日志控制台,有一个标签Memory ,我们可以在这个界面分析当前程序使用的内存情况. 运行要监控的程序(APP)后,打开Android Monitor控制台窗口,可以看到

  • Android Studio gradle 编译提示‘default not found’ 解决办法

    在导入studio工程的时候,进行sync的时候,提示Error:Configuration with name 'default' not found. 之前由于对gradle不熟悉,所以没有找到原因,其实也是偷懒,没有认真去排查问题,今天又遇到了,就折腾了会,把所有的配置文件都打开看,最终解决问题了,发现尽然是个低级的不能低级的问题,故记录下,警醒自己. 1.打开settings.gradle发现里面有很多个include ':app'这样的include,然而发现在工程的目录下面根本没有i

  • Android Studio Intent隐式启动,发短信,拨号,打电话,访问网页等实例代码

    Android Studio Intent隐式启动,发短信,拨号,打电话,访问网页等实例代码 功能 创建5个按钮,隐式启动.发短信.拨号按钮.电话按钮.打开网页按钮.通过使用Intent来完成各自按钮下的功能 代码目录如下 详细代码如下: activity_main.xml代码如下 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://sc

  • 打造酷炫的AndroidStudio插件

    前面几篇文章学习了AndroidStudio插件的基础后,这篇文章打算开发一个酷炫一点的插件.因为会用到前面的基础,所以如果没有看前面系列文章的话,请先返回.当然,如果有基础的可以忽略之.先看看本文实现的最终效果如下(好吧,很多人说看的眼花): 虽然并没有什么实际用途,但是作为学习插件开发感觉挺有意思的. 1. 基本思路 基本思路可以归结如下几步: 1).通过Editor对象可以拿到封装代码编辑框的JComponent对象,即调用如下函数:JComponent component = edito

  • Android Studio default not found错误解决办法

    Android Studio gradle 编译提示'default not found' 解决办法 在导入studio工程的时候,进行sync的时候,提示 Error:Configuration with name 'default' not found. 之前由于对gradle不熟悉,所以没有找到原因,其实也是偷懒,没有认真去排查问题,今天又遇到了,就折腾了会,把所有的配置文件都打开看,最终解决问题了,发现尽然是个低级的不能低级的问题,故记录下,警醒自己. 1.打开settings.grad

  • Android studio 出现 Unsupported major.minor version 52.0解决办法

    Android studio 出现 Unsupported major.minor version 52.0解决办法 最近更新了Android studio 之后,出现了Error:Java.lang.UnsupportedClassVersionError:com/android/dx/command/Main : Unsupported major.minor version 52.0 异常, 一.这是因为 compileSdKVersion 和 buildToosVersion 版本对不上

随机推荐