自定义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,一经查实,立即删除!

相关文章

工作219:富文本查看 编辑状态显示

1第一步 v-if <template><!-- 新建部门 --> <div class"container"><el-dialog:title"fullTitle":visible.sync"dialogFormVisible"close"close"><template><div v-if"IsShow"><e…

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。 //其中用到…

[Tomcat报错]SEVERE: Error listenerStart

系统版本&#xff1a;CentOS 6.6 x64 java版本&#xff1a;1.7.0_55 问题描述&#xff1a; 迁移Tomcat工程启动后日志出现报错&#xff0c;内容如下&#xff1a; Jan 20, 2018 7:02:50 PM org.apache.catalina.core.StandardContext startInternal SEVERE: Error listenerStart…

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

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

工作221:控制弹出框不全屏

<el-dialog :title"fullTitle" width"80%" :fullscreen"false" :close-on-click-modal"false" :visible.sync"dialogFormVisible"close"close"> 控制弹出框不全屏

Activity中 onResume和onPause与onStart()和onStop()的一些思考

也许你会遇到这种问题&#xff1a; 如果一个Activity在用户可见时才处理某个广播&#xff0c;不可见时注销掉&#xff0c;那么应该在哪两个生命周期的回调方法去注册和注销BroadcastReceiver呢&#xff1f; 下面见答案。 首先你要首先了解Activity的四种状态&#xff1a; ① Ac…

Ubuntu16.04安装搜狗输入法后有黑边问题的解决方法

apt-get install compton compton -b 转载于:https://www.cnblogs.com/xiaoyafei/p/8383678.html

glyphicons 图标大全

http://www.runoob.com/bootstrap/bootstrap-glyphicons.html

java打印运行时间

// 放在要检测的代码段前&#xff0c;取开始前的时间戳 Long startTime System.currentTimeMillis(); // 放在要检测的代码段后&#xff0c;取结束后的时间戳 Long endTime System.currentTimeMillis();// 计算并打印耗时 Long tempTime (endTime - startTime); System.out.…

工作222:title写活

<el-dialog:title"fullTitle":visible.sync"dialogFormVisible"close"close">

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文…

记录自己灵感闪现的开发语录 每日更新 记录变强或者变得更菜的过程

坚持第1天 2018年8月5日 今日博客排名115万 1、大多数人不想成为菜鸟&#xff0c;但现实是大多数人是菜鸟&#xff0c;包括我。 坚持第2天 2018年8月6日 今日博客排名115万 1、听别人说&#xff1a;“大多数人吃得了生活的苦&#xff0c;却吃不了学习的苦”。而我现在&#xff…

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

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

jsp自定义alert

普通alert alert(data.msg); 自定义alert 1、创建弹出框div <!--弹出框---------------------------> <div id"alert_div" align"center"> <div align"left">操作提示</div> …

C语言实现排名算法和排位算法

1 #include "stdio.h"2 int search_second_max(int array[], int n,int m)3 {4 int max1;5 int i,num;6 num1;//默认第一名 7 if(m>n) return 0; 8 max1 array[m];9 for (i 0; i < n; i)10 {11 if (array[i]&g…

jeesite导出Excel Minimum column number is 0

问题今天在用jeesite(poi)做导出的时候遇到一些问题&#xff01;记录一下.java.lang.IllegalArgumentException: Minimum column number is 0 at org.apache.poi.ss.util.CellRangeAddressBase.validateColumn(CellRangeAddressBase.java:73) at org.apache.poi.ss.util.CellRa…