自定义EditText输入框

转载地址:http ://blog.csdn.net/lyfzxf/article/details/53513502

很喜欢简书App的登陆框风格 。

 

自定义ImgEditText 继承与EditText。主要重写部分方法即可。

 

 

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;public class ImgEditText extends android.support.v7.widget.AppCompatEditText  implements TextWatcher {//控件左边的图片private Drawable leftDrawable = null;//控件右边的图片private Drawable rightDrawable = null;// 控件是否有焦点private boolean hasFoucs;private IMyRightDrawableClick mightDrawableClick;public ImgEditText(Context context) {this(context, null);}public ImgEditText(Context context, AttributeSet attrs) {//这里构造方法也很重要,不加这个很多属性不能再XML里面定义this(context, attrs, android.R.attr.editTextStyle);}public ImgEditText(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}//初始化基本图片private void init() {//获取RadioButton的图片集合Drawable[] drawables = getCompoundDrawables();leftDrawable = drawables[0];rightDrawable = drawables[2];setCompoundDrawablesWithIntrinsicBounds(leftDrawable, null, null, null);//设置输入框里面内容发生改变的监听addTextChangedListener(this);}//设置显示图片的大小public void setCompoundDrawablesWithIntrinsicBounds(Drawable left, Drawable top, Drawable right, Drawable bottom) {super.setCompoundDrawablesWithIntrinsicBounds(left, top, right, bottom);//这里只要改后面两个参数就好了,一个宽一个是高,如果想知道为什么可以查找源码if (left != null) {left.setBounds(0, 0, 50, 50);}if (right != null) {right.setBounds(0, 0, 50, 50);}if (top != null) {top.setBounds(0, 0, 100, 100);}if (bottom != null) {bottom.setBounds(0, 0, 100, 100);}setCompoundDrawables(left, top, right, bottom);}//光标选中时判断@Overrideprotected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {super.onFocusChanged(focused, direction, previouslyFocusedRect);this.hasFoucs = focused;if (focused) {setImageVisible(getText().length() > 0);} else {setImageVisible(false);}}//设置清除图标的显示与隐藏,调用setCompoundDrawables为EditText绘制上去protected void setImageVisible(boolean flag) {//如果当前右侧有图片则覆盖右侧的图片,如果没有还是显示原来的图片if (getCompoundDrawables()[2] != null) {rightDrawable = getCompoundDrawables()[2];}if (flag) {setCompoundDrawables(getCompoundDrawables()[0], null, rightDrawable, null);} else {setCompoundDrawables(getCompoundDrawables()[0], null, null, null);}}//文本框监听事件@Overridepublic void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {if (hasFoucs) {if (text.length() > 0) {setImageVisible(true);} else {setImageVisible(false);}}}public void beforeTextChanged(CharSequence s, int start, int count, int after) {}public void afterTextChanged(Editable s) {}/*** 因为我们不能直接给EditText设置点击事件,所以我们用记住我们按下的位置来模拟点击事件* 当我们按下的位置 在  EditText的宽度 - 图标到控件右边的间距 - 图标的宽度  和* EditText的宽度 - 图标到控件右边的间距之间我们就算点击了图标,竖直方向就没有考虑* (参考 http://blog.csdn.net/xiaanming/article/details/11066685/)*/@Overridepublic boolean onTouchEvent(MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_UP) {if (getCompoundDrawables()[2] != null) {boolean touchable = event.getX() > (getWidth() - getTotalPaddingRight())&& (event.getX() < ((getWidth() - getPaddingRight())));if (touchable) {//调用点击事件(外部实现)mightDrawableClick.rightDrawableClick();}}}return super.onTouchEvent(event);}//设置右侧按钮的点击事件,外部调用的时候实现该方法public void setDrawableClick( IMyRightDrawableClick myMightDrawableClick){this.mightDrawableClick = myMightDrawableClick;}//自定义接口(实现右边图片点击事件)public interface IMyRightDrawableClick {void rightDrawableClick();}//允许外部修改右侧显示的图片public void setRightDrawable(Drawable drawable){rightDrawable = drawable;setCompoundDrawablesWithIntrinsicBounds(leftDrawable, null, rightDrawable, null);}}

 

 

 

 

以上就是自定义类的主要代码了,注释比较清楚。

布局布局文件里直接引用就好。

 

 

<TableRow><com.sdwfvc.exiaobang.view.ImgEditTextandroid:id="@+id/et_login_password"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_marginBottom="10dp"android:layout_marginTop="10dp"android:layout_weight="1"android:background="@null"android:drawableLeft="@mipmap/mm_image"android:drawablePadding="15dp"android:drawableRight="@mipmap/eye_normal"android:hint="密码"android:inputType="textPassword"android:maxLength="16"android:paddingLeft="15dp"android:paddingRight="15dp"android:paddingTop="5dp"/></TableRow>

 

 

下面看代码中的设置

 

 

 

 

 

mEt_login_password = (ImgEditText) findViewById(R.id.et_login_password);
//登录文本框drawableRight的点击事件
mEt_login_password.setDrawableClick(this);
//登录文本框DrawableRight的点击事件
@Override
public void rightDrawableClick() {if (isHidden) {//设置EditText文本为可见的mEt_login_password.setTransformationMethod(HideReturnsTransformationMethod.getInstance());mEt_login_password.setRightDrawable(getResources().getDrawable(R.mipmap.eye_selected));} else {//设置EditText文本为隐藏的mEt_login_password.setTransformationMethod(PasswordTransformationMethod.getInstance());mEt_login_password.setRightDrawable(getResources().getDrawable(R.mipmap.eye_normal));}isHidden = !isHidden;mEt_login_password.postInvalidate();//切换后将EditText光标置于末尾CharSequence charSequence = mEt_login_password.getText();if (charSequence instanceof Spannable) {Spannable spanText = (Spannable) charSequence;Selection.setSelection(spanText, charSequence.length());}
}

 

 

 

 

这样我们的例子就完成了。

不懂的可以下载看源码,很简单。

源码下载

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyEclipse创建struts.xml

为了后期编写配置文件时&#xff0c;MyEclipse工具能给出提示&#xff0c;需要将dtd文件在MyEclipse工具加以配置。 找到XML中的XML Catalog,然后选择【add】 其中Key和Specify alternative web address可以到dtd文件中进行Copy 为MyEclipse加好dtd的配置之后&#xff0c;我们就…

Java中getPath,getAbsolutePath和getCanonicalPath区别

方法说明getPath以构造路径作为返回值getAbsolutePath以当前路径构造路径作为返回值getCanonicalPath以全路径作为返回值&#xff08;如果构造路径包含.或…&#xff0c;会进行处理&#xff09; 需要理解一下Canonical单词含义 测试示例 public static void main(String[] arg…

工作220:git clone的时候地址需要改成自己的用户名

git在clone地址的时候用户名 要写成自己 才能clone

Android 检查版本更新 Server后台下载

问题来了&#xff0c;平时开发应用也许你会遇到这种场景&#xff1a;应用启动检查服务器版本&#xff0c;若大于当前版本&#xff0c;则要从网络上下载APK文件&#xff0c;并在Activity上展示进度条。 版本更新&#xff0c;无非是下载apk文件&#xff0c;安装apk。 //其中用到…

error: style attribute '@android:attr/windowEnterAnimation' not found

是的在导入一个依赖的时候又报错了&#xff0c;除了上面这个下面还有几句类似的&#xff0c;解决方法很简单 在gradle.properties这个文件中添加如下一行代码即可&#xff1a; android.enableAapt2false 1这条语句关闭了Aapt2编译。

Java_WEB项目OOM(OutOfMemError内存溢出) MyEclipse配置Jvm内存

前言 刚刚接触的项目是基于SSM&#xff0c;但Tomcat启动时默认的64M内存就总显得不太够。程序运行过程中经常出现OOM(OutOfMemError)。 措施 搜索网上的解决方案&#xff0c;还是比较好解决的&#xff0c;需要给MyEclipse设置Jvm内存大小(即设置Tomcat的Jvm内存大小) : Win…

net.sf.ezmorph.Morpher问题解决

运行web项目&#xff0c;外部访问Servlet报错 报错如下&#xff1a; nested exception is java.lang.NoClassDefFoundError: net/sf/ezmorph/Morpher 找不到这个类&#xff1a;net.sf.ezmorph.Morpher 解决方法&#xff1a;复制这些servlet必要的jar包到WEB-INF文件夹下lib文…

工作223:状态管理里面取值

第一步 computed 第二步 取值 computed: {/*GY5 控制新增标题的显隐*/fullTitle() {return this.title "用户";},DepartmentId(){return this.$store.state.department.id},Property(){return this.$store.state.department.property}},created() {/*第二步*/ge…

工作224:当前函数造成

这种报错一般是当前页面的create函数造成的

在VirtualBox中安装BlackArch Linux

作者&#xff1a;荒原之梦安装前的准备 下载系统映像&#xff1a;BlackArch Linux官网下载页面 在本文中我使用的是BlackArch Linux的Live ISO&#xff0c;这样可以减少安装时下载系统的时间。BlackArch的Live ISO文件有7.5G&#xff0c;我们可以使用BT种子来下载&#xff0c;这…

工作225:当前导致name报错

<!-- <el-form ref"form" :model"form" size"medium" :label-width"formLabelWidth" v-loading"loading"><el-form-item label"订单名称" ><el-input v-model"form.order.name" :dis…

Maven的安装以及在Myeclipse上的配置——超详细

在网上找了配置maven的文章&#xff0c;感觉还是有点图文会比较方便查看。 一&#xff1a;Maven的下载安装 准备工作&#xff1a; 1)安装环境 Windows 7 2)需安装JDK ,并配置环境变量(略) 3) Maven版本3.0.5 4)下载地址:http://mirror.bit.edu.cn/apache/maven/maven-3/3.0.5/b…

myeclipse中如何在整个工程中搜索字符串

看图点击即可。项目——>Search——>File 选择搜索条件

myeclipse中添加Oracle数据库

打开Myeclipse后点击如图右上方进入MyEclipse Database Explorer视图 在如图空白处鼠标右击后点选new进入Create a new connection driver界面 在Driver template:中下拉选中Oracle(Thin driver); 在Driver name中填写你希望的名称&#xff1b; 在Connection URL中将后面…

SSM(Spring+SpringMVC+Mybatis)框架环境搭建(整合步骤)(一)

SSM(SpringSpringMVCMybatis)框架环境搭建(整合步骤)(一) 1. 前言 最近在写毕设过程中&#xff0c;重新梳理了一遍SSM框架&#xff0c;特此记录一下。 附上源码&#xff1a;https://gitee.com/niceyoo/jeenotes-ssm 2. 概述 在写代码之前我们先了解一下这三个框架分别是干什么…

ORA-28000: the account is locked

首先使用具有sysdba权限的账户登陆&#xff0c;如sys账户和system账户 新建一个sql窗体&#xff0c;并执行语句解锁被锁定的账户&#xff0c;如我这里sgyw账户&#xff1a; alter user sgyw account unlock; 执行成功后再次用这个账户就可以登陆系统了。

工作227:小程序学习1开始布局页面

<template><view class"box u-p-l-35 u-p-r-35 "><view class"title"><text>请选择您要管理的市场</text></view><view :class" [u-flex,u-row-center,{choose_market: selectIndex 0},{market : selectIndex…

工作228:小程序学习2开始布局页面2

<template><view class"box u-p-l-35 u-p-r-35 "><view class"title"><text>请选择您要管理的市场</text></view><view :class" [u-flex,u-row-center,{choose_market: selectIndex 0},{market : selectIndex…

mybatis BindingException: Invalid bound statement (not found)

错误截图 解决措施 此异常的原因是由于mapper接口编译后在同一个目录下没有找到mapper映射文件而出现的。 通常我们在配置SqlSessionFactory时会有如配置 1 <!-- 配置SqlSessionFactory -->2 <bean class"org.mybatis.spring.SqlSessionFactoryBean">…

前端学习(2712):重读vue电商网站32之让菜单栏展开与折叠

通过点击一个按钮&#xff0c;让侧边栏进行展开与折叠。通过 isCollapse 的值来动态变化侧边栏的宽度。 其中 cursor: pointer 设置是为了让鼠标放在折叠与展开处会有一个手指指向。 letter-spacing: 0.2em 是为了让 ||| 有一定间隔