今回の記事では、EditTextエリアにパスワードなどを入力時にテキストの表示・非表示を切り替える実装について投稿したいと思います。
EditTextを利用した場合
通常、テキストの入力エリアを定義する場合には、EditTextを利用します。
EditTextに入力されるテキストを非表示にする場合には、以下の設定をします。
<EditText
android:id="@+id/editMasterPassword"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/loginButton"
android:layout_centerHorizontal="true"
android:ems="10"
android:textSize="12dp"
android:inputType="textPassword" />
inputTypeを"textPassword"で設定することで以下のようにテキストを非表示にするようになります。
これをボタンなどで表示・非表示を切り替えるために、InputTypeの設定をする処理は以下のように実装できます。
setVisibleBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
if (editText.getInputType == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) {
/* パスワード非表示 */
editText.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
} else {
/* パスワード表示 */
editText.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
}
}
});
こんな感じの実装をしてあげれば、表示の切り替えがうまくいくと思ってました。 ですが、結果できませんでした。
-
一度TYPE_TEXT_VARIATION_VISIBLE_PASSWORDにするとTYPE_TEXT_VARIATION_PASSWORDを設定しても非表示にならない。
-
表示が切り替わるときにカーソル位置が初期化される。
といった事が発生してうまくいきません。 色々調べた結果、TextInputLayoutを使えば良いことがわかりました。
TextInputLayoutを利用した場合
TextInputLayoutを利用した場合には、以下のように実装できます。
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/layoutMasterPassword"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/loginButton"
android:layout_centerHorizontal="true"
app:passwordToggleEnabled="true">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/editMasterPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:ems="10"
android:textSize="12dp"
android:inputType="textPassword" />
</com.google.android.material.textfield.TextInputLayout>
基本的にはEditTextをTextInputLayoutで囲ってあげるだけになります。
上記の例では、TextInputLayoutがmaterialデザインのため、EditTextもmaterialデザインのTextInputEditTextに置き換えています。
そして、app:passwordToggleEnabled="true"を設定するだけで、表示・非表示の切り替えボタンも自動で設定してくれます。
実装は何も必要ありません。