今天在做项目的时候遇到了一个关于密码输入框可见性切换问题,上网搜了搜,这里面门道还不小,做一个记录吧,下次遇到就好解决了。

首先写了一个简单的测试工程:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="fill_parent"
  3. android:layout_height="fill_parent"
  4. android:orientation="vertical" >
  5. <EditText
  6. android:id="@+id/pwd_edit"
  7. android:layout_width="match_parent"
  8. android:layout_height="wrap_content"
  9. android:inputType="textPassword"/>
  10. <Button
  11. android:id="@+id/pwd_switch"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:text="转换"/>
  15. </LinearLayout>
  1. package com.example.helloword;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.text.InputType;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.widget.Button;
  9. import android.widget.EditText;
  10.  
  11. public class MainActivity extends Activity {
  12. EditText pwdEdit;
  13. boolean flag = false;
  14. @Override
  15. protected void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.activity_main);
  18. pwdEdit = (EditText) findViewById(R.id.pwd_edit);
  19. Button pwdSwitch = (Button) findViewById(R.id.pwd_switch);
  20. pwdSwitch.setOnClickListener(new OnClickListener() {
  21.  
  22. @Override
  23. public void onClick(View v) {
  24. if(flag){
  25. pwdEdit.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
  26. flag = false;
  27. }else{
  28. pwdEdit.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
  29. flag = true;
  30. }
  31. }
  32. });
  33. }
  34.  
  35. }

结果发现这种方法不行,显示密码后不能再隐藏。

于是就搜了一下,发现有个方法如下:

  1. package com.example.helloword;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.text.method.HideReturnsTransformationMethod;
  6. import android.text.method.PasswordTransformationMethod;
  7. import android.view.View;
  8. import android.view.View.OnClickListener;
  9. import android.widget.Button;
  10. import android.widget.EditText;
  11.  
  12. public class MainActivity extends Activity {
  13. EditText pwdEdit;
  14. boolean flag = false;
  15. @Override
  16. protected void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. setContentView(R.layout.activity_main);
  19. pwdEdit = (EditText) findViewById(R.id.pwd_edit);
  20. Button pwdSwitch = (Button) findViewById(R.id.pwd_switch);
  21. pwdSwitch.setOnClickListener(new OnClickListener() {
  22. @Override
  23. public void onClick(View v) {
  24. if (!flag) {
  25. pwdEdit.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
  26. } else {
  27. pwdEdit.setTransformationMethod(PasswordTransformationMethod.getInstance());
  28. }
  29. flag = !flag;
  30. pwdEdit.postInvalidate();
  31. }
  32. });
  33. }
  34.  
  35. }

发现这样虽然可以了,但是光标每次切换后会回到行首,修改后的代码如下:

  1. package com.example.helloword;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.text.Selection;
  6. import android.text.Spannable;
  7. import android.text.method.HideReturnsTransformationMethod;
  8. import android.text.method.PasswordTransformationMethod;
  9. import android.view.View;
  10. import android.view.View.OnClickListener;
  11. import android.widget.Button;
  12. import android.widget.EditText;
  13.  
  14. public class MainActivity extends Activity {
  15. EditText pwdEdit;
  16. boolean flag = false;
  17. @Override
  18. protected void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.activity_main);
  21. pwdEdit = (EditText) findViewById(R.id.pwd_edit);
  22. Button pwdSwitch = (Button) findViewById(R.id.pwd_switch);
  23. pwdSwitch.setOnClickListener(new OnClickListener() {
  24. @Override
  25. public void onClick(View v) {
  26. if (!flag) {
  27. pwdEdit.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
  28. } else {
  29. pwdEdit.setTransformationMethod(PasswordTransformationMethod.getInstance());
  30. }
  31. flag = !flag;
  32. pwdEdit.postInvalidate();
  33. CharSequence text = pwdEdit.getText();
  34. if (text instanceof Spannable) {
  35. Spannable spanText = (Spannable)text;
  36. Selection.setSelection(spanText, text.length());
  37. }
  38. }
  39. });
  40. }
  41.  
  42. }

虽然完美解决了,但是对这个HideReturnTransformationMethod和PasswordTransformationMethod很陌生,于是就上网搜了一下,发现这个类相当于是一个工具类,专门用来转换输入字符的显示的。而setTransformationMethod 则可以支持将输入的字符转换,如果需要实现自己的转换,可以通过实现 TransformationMethod 接口来达到你的目的(比如让输入的所有字符都变成 a,或者输入 a 显示 z,输入 z 显示 a 等)。

这里仅仅是个记录,如果有什么更好的方法,希望不要吝啬哦 ^_^

Android中密码输入内容可见性切换的更多相关文章

  1. Android中使用ImageViewSwitcher实现图片切换轮播导航效果

    前面写过了使用ViewFlipper和ViewPager实现屏幕中视图切换的效果(ViewPager未实现轮播)附链接: Android中使用ViewFlipper实现屏幕切换 Android中使用V ...

  2. 设置cxGrid中RichEdit输入内容的格式

    设置cxGrid中RichEdit输入内容的格式 (2013-09-05 23:25:31) 转载▼红鱼儿新浪博客   分类: Delphi 遇到这样的问题,利用cxGrid,将一列定义为RichEd ...

  3. Android中TextView输入字数统计和限制

    在Android开发应用的时候,文本编辑框中最多输入140个字,经常会显示还剩多少字以限制用户输入的字数, EditText content;//定义一个文本输入框 TextView hasnum;/ ...

  4. Android中简单活动窗口的切换--Android

    本例实现Android中简单Activity窗口切换:借助intent(意图)对应用操作(这里用按钮监听)等的描述,Android根据描述负责找对应的组件,完成组件的调用来实现活动的切换……案例比较简 ...

  5. Android TextWatcher监控EditText中的输入内容并限制其输入字符个数

    布局中EditText在android布局中经常用到,对EditText中输入的内容也经常需要进行限制,我们可以通过TextWatcher去观察输入框中输入的内容,作个笔记. 主布局: <?xm ...

  6. 在Android中自动实现横竖屏切换的问题

    http://developer.android.com/training/basics/supporting-devices/screens.html参照Google推荐的做法 在你项目的res 文 ...

  7. Android中竖线随内容高度变化而变化的问题和解决办法

    项目中要求显示竖线,并且竖线高度不确定,竖线的高度要随着内容的变化而变化.不能使用match_parent 充满,也不能在布局中写死,此时使用 android:layout_height=" ...

  8. Android 中利用ViewFlipper 滑动屏幕切换页面,ListView展示数据

    首先新建一个Android项目,命名为ViewFlipperTest 如图:项目机构,本项目主要操作图中红色箭头标注的文件 1.HgroupAdapter.java文件代码↓主要实现listview数 ...

  9. Android中TweenAnimation四种动画切换效果

    点击每个按钮都会有对应的动画显示 activity代码: package com.tmacsky; import android.app.Activity; import android.os.Bun ...

随机推荐

  1. nginx安装部署+增加媒体播放模块

    nginx安装很简单,但是有的时候是已经安装的nginx ,升级增加nginx 模块功能. 最近公司要nginx增加一个可以播放 MP4的模块,安装还算顺利,不说废话上命令. 1 安装依赖 yum i ...

  2. 洛谷——U10783 名字被和谐了

    https://www.luogu.org/problem/show?pid=U10783 题目背景 众所周知,我们称g是a的约数,当且仅当g是正数且a mod g = 0. 众所周知,若g既是a的约 ...

  3. Android Studio中怎样引用图片资源

    随着不断接触Android Studio,越来越发现和Eclipse有着巨大的差别. 不管是表面的目录结构,还是内在对各种资源的管理. 本篇就来聊聊Android Studio中怎样来显示图片. 以及 ...

  4. nagios 安装配置(包含nrpe端)全 (一)

    一.nagios安装: 1.安装下面命令: 这是本人监控服务时自己定义插件所用到的几个系统命令.可不安装. (1)iostat:监控磁盘IO信息: apt-getinstall sysstat (2) ...

  5. Express框架是什么

    Express框架是什么 一.总结 1.express框架:基于node.js的web应用框架,可快速搭建一个完整功能的网站,丰富的HTTP工具以及来自Connect框架的中间件随取随用. 二.Exp ...

  6. 指示函数(indicator function) 的作用

    1. counter 指示函数常用于次数(满足某一断言或条件)的统计: 2. 二维的离散指示函数 ⇒ assignment solution xij∈{0,1},∑jxij=1 ∑jxij=1:行和为 ...

  7. 使用@Order调整配置类加载顺序

    转自:https://blog.csdn.net/qq_15037231/article/details/78158553 4.1 @Order Spring 4.2 利用@Order控制配置类的加载 ...

  8. 关于Promise的详细总结

    1. 异步回调 1.1 回调地狱 在需要多个操作的时候,会导致多个回调函数嵌套,导致代码不够直观,就是常说的回调地狱 1.2 并行结果 如果几个异步操作之间并没有前后顺序之分,但需要等多个异步操作都完 ...

  9. 学习笔记:_lodash.js常用函数2

    _.pick(object, [props]) 创建一个从object中选中的属性的对象. 示例: var object = { 'a': 1, 'b': '2', 'c': 3 }; _.pick( ...

  10. Node.js笔记 http fs

    const http=require('http'); const fs=require('fs'); var server = http.createServer(function(req, res ...