项目中经常会有这样的需求,在密码输入框的右边有一个小图标,点击就切换显示和隐藏密码。

其实这里需求实现起来是比较容易的,主要考虑是复用问题,因为登陆、注册、修改密码界面都会有这样的情景,如果每个界面都独立写一次这样的逻辑显然是不符合代码复用的理念,所以需要把这个情景抽象出来,用代码去实现一个工具库。

首先必须说一说EditText的inputType了,当我们在XML中指定EditText的inputType为textPassword时,输入的内容会以星号呈现。

 <EditText
            android:id="@+id/edittext"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:inputType="textPassword" />

现在当程序运行的时候,输入的内容呈现为密码的形式,当我们点击显示密码的小图标,我们需要让EditText显示输入的内容,我们可以通过代码改变EditText的inputType。

if (hidePwd == true) { // 输入的内容显示为星号
    uiPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
} else { // 正常显示输入内容
    uiPassword.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
}

通常密码输入框右边有个小图标,点击会切换显示/隐藏密码,同时小图标在显示和隐藏状态中的图标是不一样的。现在针对小图标点击,然后切换密码框的输入状态,把这种行为抽象出来成为一个函数。

// image : 小图标
// editor : 输入框
// showingDrawable : 显示密码时的小图标
// hidingDrawable : 隐藏密码时的小图标
public static void bingPwdSwitch(final ImageView image, final EditText editor, final int showingDrawable, final int hidingDrawable) {
        image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (image.getTag().equals("1") || image.getTag() == null) {
                    image.setTag("0");
                    image.setImageResource(showingDrawable);
                } else {
                    image.setTag("1");
                    image.setImageResource(hidingDrawable);
                }

                if (image.getTag().equals("1") || image.getTag() == null) {
                    editor.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
                } else {
                    editor.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
                }
            }
        });
    }

上面使用了View的getTag()方法,目的是作为状态的判断,为null或者1表示当前状态是隐藏密码,为0表示当前是显示密码状态。EditText在XML中的inputType为textPassword,在Activity的onCreate()中调用函数进行绑定即可。

bingPwdSwitch(uaShowHidePwd, uiPassword, R.mipmap.login_ic_pwd, R.mipmap.login_ic_unpwd);

【安卓基础】ImageView与EditText联动实现隐藏与显示密码的更多相关文章

  1. 通过EditText的setTransformationMethod()隐藏或显示密码

    private Button mBtnPassword; private EditText mEtPassword; private boolean mbDisplayFlg = false; /** ...

  2. android 基础控件 EditText

    EditText 简介: EditText 控件继承 TextView ,它有TextView的所有属性和方法,并且自身是可编辑的: extends TextView java.lang.Object ...

  3. js基础--浏览器标签页隐藏或显示状态 visibility详解

    欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 在工作中我们可能会遇到这样的需求,当浏览器切换到别的标签页或着最小化时,我们需要暂停页面上正在播放的视频或者音乐,这个需求 ...

  4. wicket基础应用(3)——wicket控件的隐藏和显示

    在一个项目,页面经常要显示和隐藏一些控件,用wicket来控制显示和隐藏控件相当的方便. 1.最简单的隐藏和显示方法: wicket的控件大部分都有setVisible(...)方法,用这个方法就可以 ...

  5. jQuery-4.动画篇---动画基础隐藏和显示

    jQuery中隐藏元素的hide方法 让页面上的元素不可见,一般可以通过设置css的display为none属性.但是通过css直接修改是静态的布局,如果在代码执行的时候,一般是通过js控制元素的st ...

  6. EditText隐藏和显示

    <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...

  7. 【基础篇】EditText的一些属性设置

    设置EditText的背景颜色  private test_editText=null; test_editText= (EditText) findViewById(R.id.EditTextInp ...

  8. 使用padding值控制控件的隐藏与显示

    在学自定义控件下拉刷新这一案例,控制ListView头条目和尾条目的显示隐藏时,就是设置其padding值的正负控制其的显示与隐藏.这并不是什么很大的知识点.只是一个小技巧,这里给大家分享一下. 这一 ...

  9. linux如何隐藏和显示所有窗口?

    centos7 基本上就跟fedora23是一样的了, 也许它们使用的内和是一样的, fedora23使用的是4.2.3, 所以使用fedora对使用centos和redhat是有优势和好处福利的. ...

随机推荐

  1. Google搜索中的突变XSS-JavaScript Library Introduced XSS Flaw in Google Search

    前言2018年9月26日,开源Closure库(最初由谷歌创建并用于谷歌搜索)的一名开发人员创建了一个提交,删除了部分输入过滤.据推测,这是因为开发人员在用户界面设计方面出现了问题.但此次提交的开发人 ...

  2. namenode No valid image files

    1,角色日志报错 Encountered exception loading fsimage java.io.FileNotFoundException: No valid image files f ...

  3. JDBC事务的相关知识

    事务的定义 事务(Transaction):是并发控制的单元,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务,sql server 能将逻辑相关的一组操作绑 ...

  4. centos7 安装 redis-4.0.9

    下载地址:https://redis.io/download 下载 安装: $ wget http://download.redis.io/releases/redis-4.0.9.tar.gz $ ...

  5. UDP广播-缓冲区过小

    上次介绍到了关于客户端实时刷新摄像头所识别的图片的一些方法,采用了了UDP广播的技术做处理.理论上是没有问题的,将客户端运行在不同电脑上也能很好的看到效果,运行日志也没看出啥问题,结果今天翻看日志的时 ...

  6. java中存储mysql数据库时间类型

    Mysql 与 java 的时间类型 MySql的时间类型有 Java中与之对应的时间类型   date                 java.sql.Date   Datetime        ...

  7. tomcat1(servlet,http,socket)

    1.servlet容器是如何工作的? a.创建一个request对象,用可能会在调用的Servlet中使用到的信息填充该request对象(参数,头,cookies,查询字符串,URI等).reque ...

  8. 堆排序 P1090 合并果子

    P1090 合并果子 本题要用到堆 一个小根堆 每次取出两堆,合并成一堆,为了让多多花费体力最少,我们要尽量少的重复大堆的合并,因此每次合并完以后,要把新的一坨放到堆里排一排,维护一个堆 有必要强调一 ...

  9. ELK学习笔记之ELK搜集OpenStack节点日志

    模板来自网络,模板请不要直接复制,先放到notepad++内调整好格式,注意缩进 部署架构 控制节点作为日志服务器,存储所有 OpenStack 及其相关日志.Logstash 部署于所有节点,收集本 ...

  10. List、Set、Map的区别

    (图一) 1.面试题:你说说collection里面有什么子类. (其实面试的时候听到这个问题的时候,你要知道,面试官是想考察List,Set) 正如图一,list和set是实现了collection ...