Android程序开发之防止密码输入错误 密码明文显示功能

在使用App的时候,首次登录都需要用户输入密码的,有些朋友为了安全起见密码设置的比较长,导致很多次密码都输入错误,严重影响了用户体验效果。这一点移动开发者做好了准备工作,因为手机的私密性比较强,在输入密码的时候,可以显示输入,增强准确性,提升用户体验度。这当然要付出代价的,需要额外的代码编写功能。下面通过本文给大家介绍如何编写密码明文显示的功能,仅供参考。

本文源码的GitHub下载地址

要点

(1) 重写EditText, 添加提示密码显示和隐藏的图片.

(2) 判断点击位置, 切换EditText的密码显示状态.

(3) 在屏幕旋转或配置改变时, 保留图片的状态信息.

实现只有一个类和两个图片资源, 大家可以自由定制.

1. 布局样式

两种密码的显示样式, 一种是常规显示, 一种是TextInputLayout显示.

<LinearLayout android:id="@+id/main_ll_container_1" android:layout_width="match_parent" android:layout_height="40dp" android:gravity="center"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="密码:" android:textSize="20sp"/> <me.chunyu.spike.wcl_password_input_demo.PasswordEditText android:id="@+id/main_pet_password" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:hint="请输入密码"/> </LinearLayout> <android.support.design.widget.TextInputLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/main_ll_container_1"> <me.chunyu.spike.wcl_password_input_demo.PasswordEditText android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:hint="请输入密码"/> </android.support.design.widget.TextInputLayout>

效果

2. 提示图标

初始化资源和布局, 获取密码图片的资源, 监听EditText, 有文字时显示图标, 没有文字时隐藏图标.

// 初始化布局 public void initFields(AttributeSet attrs, int defStyleAttr) { if (attrs != null) { // 获取属性信息 TypedArray styles = getContext().getTheme().obtainStyledAttributes(attrs, R.styleable.PasswordEditText, defStyleAttr, 0); try { // 根据参数, 设置Icon mShowPwdIcon = styles.getResourceId(R.styleable.PasswordEditText_pet_iconShow, mShowPwdIcon); mHidePwdIcon = styles.getResourceId(R.styleable.PasswordEditText_pet_iconHide, mHidePwdIcon); } finally { styles.recycle(); } } // 密码状态 setInputType(EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_PASSWORD); 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) { if (s.length() > 0) { // 有文字时显示指示器 showPasswordVisibilityIndicator(true); } else { mIsShowPwdIcon = false; restorePasswordIconVisibility(mIsShowPwdIcon); showPasswordVisibilityIndicator(false); // 隐藏指示器 } } @Override public void afterTextChanged(Editable s) { } }); }

setInputType设置密码状态, TYPE_TEXT_VARIATION_PASSWORD密文状态.

通过pet_iconShow属性, 可以选择自定义密码提示图片.

3. 监听事件

点击图片, 切换显示或隐藏密码, 获取点击位置, 和图片位置进行比较, 判断事件.

@Override public boolean onTouchEvent(MotionEvent event) { if (mDrawableSide == null) { return super.onTouchEvent(event); } final Rect bounds = mDrawableSide.getBounds(); final int x = (int) event.getRawX(); // 点击的位置 int iconX = (int) getTopRightCorner().x; // Icon的位置 int leftIcon = iconX - bounds.width(); Log.e(TAG, "x: " + x + ", leftIcon: " + leftIcon); // 大于Icon的位置, 才能触发点击 if (x >= leftIcon) { togglePasswordIconVisibility(); // 变换状态 event.setAction(MotionEvent.ACTION_CANCEL); return false; } return super.onTouchEvent(event); }

切换明文或密文的密码

// 设置密码指示器的状态 private void restorePasswordIconVisibility(boolean isShowPwd) { if (isShowPwd) { // 可视密码输入 setInputType(EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD); } else { // 非可视密码状态 setInputType(EditorInfo.TYPE_CLASS_TEXT | EditorInfo.TYPE_TEXT_VARIATION_PASSWORD); } // 移动光标 setSelection(getText().length()); }

4. 保存状态

重写SavedState, 在旋转屏幕时, 保存和恢复显示图片信息.

// 存储密码状态, 显示Icon的位置 protected static class PwdSavedState extends BaseSavedState { private final boolean mShowingIcon; private PwdSavedState(Parcelable superState, boolean showingIcon) { super(superState); mShowingIcon = showingIcon; } private PwdSavedState(Parcel in) { super(in); mShowingIcon = in.readByte() != 0; } public boolean isShowingIcon() { return mShowingIcon; } @Override public void writeToParcel(Parcel destination, int flags) { super.writeToParcel(destination, flags); destination.writeByte((byte) (mShowingIcon ? 1 : 0)); } public static final Parcelable.Creator<PwdSavedState> CREATOR = new Creator<PwdSavedState>() { public PwdSavedState createFromParcel(Parcel in) { return new PwdSavedState(in); } public PwdSavedState[] newArray(int size) { return new PwdSavedState[size]; } }; }

动画效果

现在可以把类复制到应用中, 更换图片资源, 替换显示密码框, 给用户更好的移动端体验. 永远追求极致, 追求不凡.

关于Android程序开发之防止密码输入错误 密码明文显示功能的相关知识就给大家介绍到这里,希望对大家有所帮助!

时间: 2024-08-02 16:36:31

Android程序开发之防止密码输入错误 密码明文显示功能的相关文章

Android程序开发之防止密码输入错误 密码明文显示功能_Android

在使用App的时候,首次登录都需要用户输入密码的,有些朋友为了安全起见密码设置的比较长,导致很多次密码都输入错误,严重影响了用户体验效果.这一点移动开发者做好了准备工作,因为手机的私密性比较强,在输入密码的时候,可以显示输入,增强准确性,提升用户体验度.这当然要付出代价的,需要额外的代码编写功能.下面通过本文给大家介绍如何编写密码明文显示的功能,仅供参考. 本文源码的GitHub下载地址 要点 (1) 重写EditText, 添加提示密码显示和隐藏的图片. (2) 判断点击位置, 切换EditT

android系统在解锁屏幕的时候密码输入错误系统会有广播发出吗?

问题描述 android系统在解锁屏幕的时候密码输入错误系统会有广播发出吗? 密码输入错误以及在多次输入之后系统提示在30秒之后再试的时候系统会有广播发出吗? 解决方案 在正常没有恶意代码和后面的情况下,不会. 解决方案二: 应该是不会的,因为这个属于应用范畴,你可以试试自己定义一个广播

Android程序开发仿新版QQ锁屏下弹窗功能_Android

新版的qq,可以在锁屏下弹窗显示qq消息,正好目前在做的项目也需要这一功能.经过各种试验和资料查找,终于实现,过程不难,但是却有一些地方需要注意. 下面是实现过程. 1.使用Activity,而不是View QQ的弹窗一开始我以为是悬浮View,用WindowManager去添加,但是无论如何就是不显示,后来在朋友提示下换成Activity来实现,在锁屏状态下就能弹窗了. 2.Activity的设置 Activity需要进行以下设置,才可以在锁屏状态下弹窗. 首先是onCreate方法,需要添加

Android程序开发之获取汉字的首字母_Android

获取一个汉字的拼音首字母. GB码两个字节分别减去160,转换成10进制码组合就可以得到区位码例如汉字"你"的GB码是0xC4/0xE3,分别减去0xA0(160)就是0x24/0x430x24转成10进制就是36,0x43是67,那么它的区位码就是3667,在对照表中读音为'n'. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&quo

Android程序开发之给背景图加上移动的手势_Android

一,工程图. 二,效果图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController : UIViewController <UIGestureRecognizerDelegate> @end RootViewController.m #import "RootViewController.h" @interface RootViewController ()

Android程序开发之获取汉字的首字母

获取一个汉字的拼音首字母. GB码两个字节分别减去160,转换成10进制码组合就可以得到区位码例如汉字"你"的GB码是0xC4/0xE3,分别减去0xA0(160)就是0x24/0x430x24转成10进制就是36,0x43是67,那么它的区位码就是3667,在对照表中读音为'n'. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&quo

怎么设置开机密码多次输入错误密码锁定电脑?

  1.使用组合快捷键win键+r键打开运行窗口,输入"gpedit.msc"回车确认.如下图所示 2.在打开的本地组策略编辑器窗口中,依次展开"计算机配置"-"windows设置"-"安全设置"-"账户策略"-"账户锁定策略"并且找到"帐户锁定阈值"如下图所示 3.在打开的帐户锁定阈值属性窗口中,输入无效登录的次数然后点击"确定"完成操作.如下图

android程序升级版本以后 出现getResource错误

问题描述 android程序升级版本以后 出现getResource错误 程序单独是没有问题的,升级以后出现getResource时去寻找一个并不存在的资源id 清除程序数据或者删掉之前的版本升级就可以 这到底是什么原因 解决方案 可能有的旧id被保存在SharePreference里面了 解决方案二: 你描述的不清楚啊!升级后找不到是不是apk有问题啊 解决方案三: 我不知道是不是apk有问题啊...之前的程序删除后 在安装就没有问题.直接覆盖就会报上面的错误

login-jsp 弹出登录窗口怎么让它密码输入错误时不做操作

问题描述 jsp 弹出登录窗口怎么让它密码输入错误时不做操作 <script> jQuery(document).ready(function($) { $('.theme-login').click(function(){ $('.theme-popover-mask').fadeIn(100); $('.theme-popover').slideDown(200); }) $('.theme-poptit .close').click(function(){ $('.theme-popov