增强的密码输入视图:切换密码的可见性。
嘿!我决定在延迟之后继续写博客来分享更多关于 Android 开发的东西。今天先从一个简单的开始:密码输入框。
增强的密码输入。
通常,登录或注册 UI 表单有一些密码输入字段。 Android SDK 提供了一种简单的方法来输入带有隐藏字符的字段:EditText 和 inputType="textPassword"。很简单。但是,如果您需要输入一些又长又复杂的密码,这可能会有点乏味:输入类型很容易,然后您需要重新开始输入密码。
解决方案。
因此,为了使密码输入更容易,我们可以实现一个简单但非常有效的解决方案:在输入字段的右边缘显示一个图标,当您点击图标时 - 输入的密码变得可见,当您抬起手指时 - 它再次仅显示模糊的字符。简单、有效且安全!
至少有三种明显的可能方法可以实现这一目标:
在布局中编写默认的 Android SDK 视图并将行为逻辑放入父 Fragment/Activity
制作一个组合的 ViewGroup 来封装布局和行为逻辑
创建一个 EditText 子类来管理视图右侧的自定义可绘制对象
所有这三种方式都对你有好处。最初我使用第一种方式制作有几个原因,例如:
我不喜欢在没有真正必要的情况下创建额外的实体。类似于奥卡姆剃刀原则。 :)
我只需要把它放在一个地方
当然,如果您需要在不同的地方多次查看相同的增强密码视图,请选择第 2 或第 3(首选,因为视图层次结构是扁平的)选项。
实施。
因此,使用默认 Android SDK 视图的增强密码视图的最简单实现可能如下所示:
-
在 XML 布局中的标志中(省略了与主题无关的琐碎参数,如填充):
<RelativeLayout
...>
<EditText
android:id="@+id/fragment_login_password"
android:inputType="textPassword"
.../>
<ImageView
android:id="@+id/fragment_login_password_visibility"
android:layout_alignRight="@+id/fragment_login_password"
android:clickable="true"
android:src="@drawable/ic_show_password"
.../>
</RelativeLayout>
-
在父片段/活动中:
2.1。为了获得良好的用户体验,让我们添加一个文本更改侦听器,以在输入密码值时显示密码可见性,并在空密码视图中隐藏它:
mPasswordView.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) {
}
@Override
public void afterTextChanged(Editable s) {
mPasswordVisibilityView.setVisibility(s.length() > 0 ? View.VISIBLE : View.GONE);
}
});
2.2。为密码可见性视图设置触摸侦听器以对触摸做出反应
mPasswordVisibilityView.setOnTouchListener(mPasswordVisibleTouchListener);
如果手指在可见性视图内向下,触摸侦听器应用可见字符模式,并在手指向上或离开可见性视图时应用原始密码模式。我们还关注光标位置的持久化,因此用户可以随时切换可见性模式而不会丢失当前输入光标位置。
private View.OnTouchListener mPasswordVisibleTouchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
final boolean isOutsideView = event.getX() < 0 ||
event.getX() > v.getWidth() ||
event.getY() < 0 ||
event.getY() > v.getHeight();
// change input type will reset cursor position, so we want to save it
final int cursor = mPasswordView.getSelectionStart();
if (isOutsideView || MotionEvent.ACTION_UP == event.getAction())
mPasswordView.setInputType( InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD);
else
mPasswordView.setInputType( InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
mPasswordView.setSelection(cursor);
return true;
}
};
就是这样!正如我所说,它实现起来非常简单,但它极大地改善了用户体验!