TextInputLayoutのpassword visibility toggleを試してみた

Android support library 24.2.0からTextInputLayoutに追加されたpassword visibility toggleを試してみた。

試したサンプルコードはGithubにあげてあります。

https://github.com/operando/TextInputLayout-Password-Visibility-Toggle-Sample


## password visibility toggleってなんぞ？？

簡単に説明するとパスワード入力する際に、入力している内容をtoggleで表示・非表示と切り替えるやーつーですね(雑だな...

Material Designのドキュメントに詳しく書いてあるので、それを見れば「あーこれかー」となるはず。

https://material.google.com/components/text-fields.html#text-fields-required-fields

んで、今までこれと似たようなものを実装したことがある人ならわかるだろうけど、今まで独自の方法で実装するしかなかったわけだ。

その実装がsupport library 24.2.0からTextInputLayoutに導入されたってこと。うれしいです☺

さようなら、独自実装...😇 

## TextInputLayoutでどのようにpassword visibility toggleを使うか

基本はすごく簡単です。

以下のような感じでTextInputLayoutの子ViewのEditTextに`android:inputType="textPassword"`を指定するだけで、デフォルトのpassword visibility toggleが出てきます。

```xml
<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="textPassword"
        android:inputType="textPassword" />
</android.support.design.widget.TextInputLayout>
```

こんな感じで動きます！簡単ですね！！

![hammerheadMOB30Yshinobu.okano09232016215800.gif](https://qiita-image-store.s3.amazonaws.com/0/43637/429fdfe0-694b-387f-6223-636d77aa7a1c.gif)


もしpassword visibility toggleを出したくなければ、TextInputLayoutに`app:passwordToggleEnabled="false"`を追加すると出なくまります。


## inputTypeのxxxPasswordすべて試してみた

以下のような感じでinputTypeのxxxPasswordすべて試してみます。(長いのでlayout_widthとlayout_height省いてます

```xml
<android.support.design.widget.TextInputLayout ... >

    <EditText
        android:hint="textPassword"
        android:inputType="textPassword" />
</android.support.design.widget.TextInputLayout>

<android.support.design.widget.TextInputLayout ... >

    <EditText
        android:hint="numberPassword"
        android:inputType="numberPassword" />
</android.support.design.widget.TextInputLayout>

<android.support.design.widget.TextInputLayout ... >

    <EditText
        android:hint="textVisiblePassword"
        android:inputType="textVisiblePassword" />
</android.support.design.widget.TextInputLayout>

<android.support.design.widget.TextInputLayout ... >

    <EditText
        android:hint="textWebPassword"
        android:inputType="textWebPassword" />
</android.support.design.widget.TextInputLayout>
```

hintに出ている値が各EditTextのinputTypeに設定されています。

![hammerheadMOB30Yshinobu.okano09232016220246.gif](https://qiita-image-store.s3.amazonaws.com/0/43637/58e80e9f-6132-457d-03b0-ea1b345053fa.gif)


`android:inputType="textVisiblePassword"`を設定しているものはpassword visibility toggleが出てないですね。当たり前かー。


## passwordToggleDrawableでアイコンを変更する

デフォルトの目のアイコンは`passwordToggleDrawable`属性で変えられます。

サンプルコードではVectorのドロイド君にアイコンを変更してます(デフォルトの目のアイコンもVectorです

```xml
<android.support.design.widget.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:passwordToggleDrawable="@drawable/ic_android_black_24dp">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="passwordToggleDrawable"
        android:inputType="textPassword" />
</android.support.design.widget.TextInputLayout>
```

変更すると以下のような感じでアイコンが変わります。

![hammerheadMOB30Yshinobu.okano09232016222051.gif](https://qiita-image-store.s3.amazonaws.com/0/43637/de4d7904-e813-704c-5c15-ead0f55b7f65.gif)

## XMLの属性だけじゃなくてメソッドもちゃんとありますよ

今回のサンプルコードでは全てXMLの属性で指定してますが、ちゃんと属性とマッチしてるメソッドも用意されてます。

詳しくはTextInputLayoutのドキュメントを見てみてください。

https://developer.android.com/reference/android/support/design/widget/TextInputLayout.html

今回は使用しませんでしたが属性も他に`passwordToggleTint`や`passwordToggleTintMode`があります。

自身のアプリのデザインに合わせてカスタマイズすると良さそうですね。


## まとめ

デフォルトのデザインでいいのならTextInputLayoutでpassword visibility toggleを試すのはすごく簡単だったなー

support libraryでこういうのが増えてくれるのは独自で実装する部分が減るのでとても助かりますねー