概要
Google Play ストアのレビューに「メールアドレスとパスワードをちゃんと入力しているのに全然ログインできません!」といった苦情が多々寄せられるようになったため、Slack アプリの様にパスワード入力フォームの目隠しを外せるようにする方針になりました。
調査してみた結果
Stack Overflow の回答が引っかかりました。
一番評価が高かった回答を実際に試してみましたが、気になった点がいくつかありました。
Android 4.0.4 の端末で文字入力直後にパスワードの表示/非表示を素早く切り替えると同じ文字が2文字連続で入力されてしまう
パスワード表示/非表示状態の場合で文字列の長さが異る
ソフトキーボードの種類によっては表示/非表示を切り替えると英数字入力から日本語入力に変更されることがある
パスワードの表示/非表示を切り替えるとカーソルの位置が0文字目に移動してしまう
更に調査してみた結果
上記のような問題点が解消されているものがないか探してみたところ、Android でパスワード入力フォーム目隠しの表示/非表示を切り替えることができるライブラリを見つけました Show/Hide Password EditText
追記(2017.10.01)
Design Support Library の 24.2.0
にて TextInputLayout がパスワードの表示/非表示に対応したため、Show/Hide Password EditText の使用は 2016 年 8 月 18 日付けで非推奨になりました。
Deprecated になる以前(2016.07.11 投稿時点)
Show/Hide Password EditText を使ってみました
allprojects {
repositories {
maven {
url "https://jitpack.io"
}
}
}
dependencies {
compile 'com.github.scottyab:showhidepasswordedittext:0.8'
}
<?xml version="1.0" encoding="utf-8"?>
<android.support.percent.PercentRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.scottyab.showhidepasswordedittext.ShowHidePasswordEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPassword" />
<!-- パスワード入力フォーム -->
</android.support.percent.PercentRelativeLayout>
package jp.co.package.example;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
/**
* パスワード入力画面
*/
public class PasswordInputActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_password_input);
}
}
2016年7月10日時点のバージョン 0.8
では アイコンの Drawable が自動的に表示される仕組みになっているので、CheckBox でパスワードの表示/非表示を切り替えできるようにしたい場合などは
https://github.com/scottyab/showhidepasswordedittext/blob/master/library/src/main/java/com/scottyab/showhidepasswordedittext/ShowHidePasswordEditText.java から必要な部分を抜き出して独自実装する必要があります。
ライブラリからコードを抜き出して実装してみた
<?xml version="1.0" encoding="utf-8"?>
<android.support.percent.PercentRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.AppCompatCheckBox
android:id="@+id/checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true" />
<!-- チェックボックス -->
<jp.co.package.example.ShowHidePasswordEditText
android:id="@+id/password_input_editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/checkbox"
android:inputType="textPassword"
android:singleLine="true" />
<!-- 自前実装したパスワード入力フォーム -->
</android.support.percent.PercentRelativeLayout>
package jp.co.package.example;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
/**
* パスワード入力画面
*/
public class PasswordInputActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_password_input);
final ShowHidePasswordEditText passwordEditText = (ShowHidePasswordEditText) findViewById(R.id.password_input_editText);
findViewById(R.id.checkbox).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// チェックボックスがクリックされた時に呼び出されます
passwordEditText.togglePasswordVisibility();
}
});
}
}
ライブラリ使用のメリット
Android 4.0.4 端末で文字入力直後にパスワードの表示/非表示を素早く切り替えても直前に入力した文字が重複して入力されない
パスワード表示/非表示状態の場合で文字列の長さが同じ
(
android:inputType="textPassword"
を指定した場合)
表示/非表示を切り替えてもソフトキーボードが英数字入力のまま
表示/非表示を切り替えてもカーソルの位置が保持される
という長所があるのでパスワードの表示/非表示を切り替えたい場合は Show/Hide Password EditText ライブラリの使用 or 参照がお勧めです。
結論
TextInputLayout を使用するのが良いそうです