欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-02-27 19:00:27
 这篇文章是继自定义edittext样式之后的功能强化,对于实际应用项目有很大的参考意见,感兴趣的朋友可以移步上一篇,”android studion自定义edi...

 这篇文章是继自定义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>

附上实际效果图:

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

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

图标素材:

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

以上所述是小编给大家介绍的android studio edittext点击图标清除文本内容,希望对大家有所帮助