プログラムでEditTextの入力タイプをPASSWORDからNORMALに、またはその逆に変更します。


190

私のアプリケーションでは、EditTextデフォルトの入力タイプがデフォルトで設定さandroid:inputType="textPassword"れているを持っています。それは持ってCheckBoxチェックされ、その右側に、そののEditText NORMAL PLAIN TEXTへの入力タイプを変更します。そのためのコードは

password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

私の問題は、そのCheckBoxがオフの場合、入力タイプをPASSWORDに再度設定する必要があることです。私はそれを使ってやった-

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

ただし、そのedittext内のテキストは引き続き表示されます。そして驚いたことに、私がオリエンテーションを変更すると、入力タイプは自動的にPASSWORDに設定され、中のテキストは箇条書きになります(パスワードのように表示されます)。

これを達成する方法はありますか?


エディットテキストのメールタイプを設定する方法mailEdt.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS); 動作していないようです。
Mahendran、2012

5
を使用しmailEdt.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);ます。私のために働く。
Rajkiran

回答:


346

同じ問題を抱えている人々のためだけに。プログラムでそのEditTextに属性を追加するだけで完了です。

password.setInputType(InputType.TYPE_CLASS_TEXT |
    InputType.TYPE_TEXT_VARIATION_PASSWORD);

数値パスワード(ピン)の場合。

password.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD);

また、カーソルがEditTextのテキストの最後にあることを確認してください。入力タイプを変更すると、カーソルが自動的に開始点に設定されるためです。したがって、次のコードを使用することをお勧めします。

et_password.setInputType(InputType.TYPE_CLASS_TEXT | 
    InputType.TYPE_TEXT_VARIATION_PASSWORD);
et_password.setSelection(et_password.getText().length());

データバインディングを使用する場合、次のコードを使用できます。

<data>
        <import type="android.text.InputType"/>
.
.
.
<EditText
android:inputType='@{someViewModel.isMasked ? 
(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD) :
InputType.TYPE_CLASS_TEXT }'

Kotlinを使用している場合、

password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD

2
正解で述べたように-選択を変更する代わりに使用できますInputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
mente

17
私はなぜアンドロイドがカーソルを移動することを選択するのか理解していません、それは単に開発者の生活をはるかに困難にします。
Rafael Sanches 2014年


2
ユーザーがパスワードフィールドの中央を編集している場合、これによりカーソルが常に最後に置かれます。この問題を回避するにはeditText.getSelectionStart()、およびeditText.getSelectionEnd()を使用することをお勧めしsetSelection(start, end)ます。
JMロード

1
人々はさらに下を見下ろしてはいけません。これが最良の答えであり、@ JM Lordの提案された変更を行うことをお勧めします。
マーク

55

このコードを使用してパスワードをテキストに、またはその逆に変更します

mCbShowPwd.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // checkbox status is changed from uncheck to checked.
                if (!isChecked) {
                        // hide password
                    mEtPwd.setTransformationMethod(PasswordTransformationMethod.getInstance());
                } else {
                        // show password
                    mEtPwd.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                }
            }
        });

完全なサンプルコードについては、http://www.codeproject.com/Tips/518641/Show-hide-password-in-a-edit-text-view-password-tyを参照してください。


6
HideReturnsTransformationMethod.getInstance()がパスワードを表示し、PasswordTransformationMethod.getInstance()がパスワードを非表示...実装は正しいが、コメントが逆になっている
Ahmed Adel Ismail

2
これが最良の答えです。完了するには、次のコマンドを使用してカーソルを最後の文字に移動します。txtpassword.setSelection(txtpassword.getText()。length());
Josh

EL-conte De-monte TereBentikhによって強調されたポイントのため、しばらくの間は機能していないようです。ジョシュの提案も役に立ちます。これが最良の答えです。
アジェイ2015年

シンプルで最高のthnks
サム

1
あなたは私の友達の教授です!このソリューションでは、パスワードモード(セキュアテキスト)に戻した後、フォントの問題に直面していません。
Tzegenos

16
password.setInputType(InputType.TYPE_CLASS_TEXT | inputType.TYPE_TEXT_VARIATION_PASSWORD);

上記の方法は本当に私にはうまくいきませんでした。以下の回答は2.2 SDKで機能します。

password.setTransformationMethod(PasswordTransformationMethod.getInstance());

EditTextのinputTypeを設定しますか?


12

ImageViewを使用して、より少ないコードで可視性を切り替えるもう1つの簡単な例です。単一のInputType割り当てのため、等価演算子のみが必要です。

EditText inputPassword = (EditText) findViewById(R.id.loginPassword);
ImageView inputPasswordShow = (ImageView) findViewById(R.id.imagePasswordShow);
inputPasswordShow.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View view) {
         if(inputPassword.getInputType() == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) {
              inputPassword.setInputType( InputType.TYPE_CLASS_TEXT |
                                        InputType.TYPE_TEXT_VARIATION_PASSWORD);
         }else {
              inputPassword.setInputType( InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD );
         }
         inputPassword.setSelection(inputPassword.getText().length());
    }
});

交換:

InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD

と:

InputType.TYPE_CLASS_TEXT

同じ結果になりますが、単語は短くなります。


12
Checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // checkbox status is checked.
                if (isChecked) {
                        //password is visible
 PasswordField.setTransformationMethod(HideReturnsTransformationMethod.getInstance());     
                } else {
                        //password gets hided
             passwordField.setTransformationMethod(PasswordTransformationMethod.getInstance());       
                }
            }
        });

6

これは私のために働きました:

mytext.setInputType(InputType.TYPE_CLASS_NUMBER);

まず質問を読んでください。パスワードフィールドとテキストフィールドを切り替えたいのですが。これは私に数値テキストフィールドを与えます。
Rajkiran

6

OK何時間もの試行を経て、ようやく実装されました。以下はコードです。

  buttons.get(2).setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
       if(buttons.get(2).getText().toString().equalsIgnoreCase(getResources().getString(R.string.show))){
           editTexts.get(1).setInputType(InputType.TYPE_CLASS_TEXT);
           editTexts.get(1).setSelection(editTexts.get(1).getText().length());
           buttons.get(2).setText(getResources().getString(R.string.hide));
        }else{
           editTexts.get(1).setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD);
           //editTexts.get(1).setTransformationMethod(PasswordTransformationMethod.getInstance());
           editTexts.get(1).setSelection(editTexts.get(1).getText().length());
           buttons.get(2).setText(getResources().getString(R.string.show));
       }

    }
});

説明:-デフォルトのテキストが表示されるボタンがあります。onclickイベントの後、ボタンのテキストが表示されるかどうかを確認します。表示されている場合は、入力タイプを変更し、カーソル位置を調整して、新しいテキストを非表示に設定します。

それが非表示の場合...逆を行う、つまりパスワードを非表示にし、カーソルを調整し、テキストを表示として設定します。以上です。それは魅力のように働いています。



5

このコードを使用して、パスワードをテキストに、またはその逆に変更します。このコードは私にとって完璧に機能しました。これを試して..

EditText paswrd=(EditText)view.findViewById(R.id.paswrd);

CheckBox showpass=(CheckBox)view.findViewById(R.id.showpass);
showpass.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
    if(((CheckBox)v).isChecked()){
        paswrd.setInputType(InputType.TYPE_CLASS_TEXT);

    }else{
        paswrd.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD);
    }

}
});

受け入れられた回答とどう違うのですか?スパムを送信する前に、質問と回答を注意深くお読みください。
Rajkiran 2015

3

これは、パスワードを表示/非表示にする画像/ボタンの完全なonClickハンドラです。

    new OnClickListener() {
        @Override
        public void onClick(View v) {
            // current ursor position
            int cursorPosition = edtPassword.getSelectionStart();

            // toggles the control variable
            isPassworsVisible = !isPassworsVisible;

            // sets the image toggler inside edit text
            passwordVisible.setImageDrawable(getResources().getDrawable(isPassworsVisible ? R.drawable.ic_eye_checked : R.drawable.ic_eye_unchecked));

            // apply input type
            edtPassword.setInputType(isPassworsVisible ? InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD : InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);

            // returns cursor to position
            edtPassword.setSelection(cursorPosition);
        }
    };

をありがとうedtPassword.getSelectionStart()
CoolMind 2018

3

ライブラリのバージョン24.2.0をサポートするためにパスワード表示切り替え機能が追加され、を使用EditTextせずにから直接パスワードを切り替えることができますCheckBox

基本的には、まずサポートライブラリのバージョンを24.2.0に更新し、次にinputTypeパスワードをTextInputEditText。これを行う方法は次のとおりです。

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

        <android.support.design.widget.TextInputEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/password"
            android:inputType="textPassword"/>
</android.support.design.widget.TextInputLayout>

新機能の詳細については、TextInputLayoutの開発者向けドキュメントをご覧ください。


3

サポートライブラリv24.2.0以降。あなたはこれをとても簡単に達成することができます

あなたがする必要があるのはただです:

  1. 依存関係にデザインライブラリを追加する

    dependencies {
         compile "com.android.support:design:25.1.0"
    }
  2. TextInputEditTextと組み合わせて使用TextInputLayout

    <android.support.design.widget.TextInputLayout
        android:id="@+id/etPasswordLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:passwordToggleEnabled="true">
    
        <android.support.design.widget.TextInputEditText
            android:id="@+id/etPassword"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/password_hint"
            android:inputType="textPassword"/>
    </android.support.design.widget.TextInputLayout>

passwordToggleEnabled 属性はパスワードの切り替えを表示します

  1. ルートレイアウトに追加することを忘れないでください xmlns:app="http://schemas.android.com/apk/res-auto"

  2. 次のコマンドを使用して、パスワードトグルをカスタマイズできます。

app:passwordToggleDrawable-パスワード入力の表示切り替えアイコンとして使用するドローアブル。
app:passwordToggleTint-パスワード入力の表示切り替えに使用するアイコン。
app:passwordToggleTintMode-背景の色合いを適用するために使用されるブレンドモード。

詳細については、TextInputLayoutのドキュメントをご覧ください。 ここに画像の説明を入力してください


2

Visual Studio / Xamarinの同様のソリューションを探した結果、このスレッドにたどり着きました。以下は、Xamarinで私のために働いたものです。この実装は、TYPE_TEXT_FLAG_NO_SUGGESTIONSモードを切り替えるときにフラグを保持することに注意してください。

EditText et = FindViewById<EditText>(Resource.Id.ET);

キャラクターを表示するには: et.InputType = Android.Text.InputTypes.TextVariationVisiblePassword | Android.Text.InputTypes.TextFlagNoSuggestions;

文字を非表示にするには: et.InputType = Android.Text.InputTypes.TextVariationPassword | Android.Text.InputTypes.ClassText;

終了位置を設定するには: int position = et.Text.Length; et.SetSelection(position, position);


このコードif (edittext.getInputType() == (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD )){ edittext.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD ); }else{ edittext.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD ); }をVisual Studio / Xamarin に使用する方法
sunil y 2017

if()条件でedittextのinputtypeを取得する方法を意味します。
sunil y 2017

2

いくつかの動的な状況holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);は機能しないので、そのように両方を使用する方が良い

holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);
holder.edit_pin.setTransformationMethod(PasswordTransformationMethod.getInstance());

注:これは、arrayaapterを使用するような動的コントロールを使用している場合に適しています。


2

あなたの後にsetInputTypeパスワードフィールドのため、あなたが持っているだろうとの問題FONTを
ここではフォントの問題もなく表示/非表示のパスワードのための私のソリューションです。

protected void onCreate(Bundle savedInstanceState) {
    ...
    findViewById(R.id.button_show_hide_password).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (isPasswordVisible(edtPassword)) {
                enableInputHiddenPassword(edtPassword);
            } else {
                enableInputVisiblePassword(edtPassword);
            }
            edtPassword.setSelection(edtPassword.getText().length());
        }
    });
}

final int INPUT_TYPE_VISIBLE_PASSWORD = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD;
final int INPUT_TYPE_HIDDEN_PASSWORD = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD;

private boolean isPasswordVisible(EditText editText) {
    return editText.getInputType() == INPUT_TYPE_VISIBLE_PASSWORD;
}

private void enableInputVisiblePassword(EditText editText) {
    Typeface cache = editText.getTypeface();
    editText.setInputType(INPUT_TYPE_VISIBLE_PASSWORD);
    editText.setTypeface(cache);
}

private void enableInputHiddenPassword(EditText editText) {
    Typeface cache = editText.getTypeface();
    editText.setInputType(INPUT_TYPE_HIDDEN_PASSWORD);
    editText.setTypeface(cache);
}

注:InputType.TYPE_TEXT_VARIATION_PASSWORD代わりに、InputType.TYPE_CLASS_TEXTまたはHideReturnsTransformationMethodキーボードにテキストと数字の両方を表示させるために使用しています

デモ


1

android:inputType="textPassword"レイアウトから削除します。そのため、向きが変わるとパスワードに戻ります。これは、向きが変わるたびにビューが再作成されるためです。

最初の問題についてはこれを試してください:

String text = password.getText();
password.setText("");
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
password.setText(text);

基本的に、入力タイプを変更する前にテキストを空にしてから、再び追加します。


機能していません。password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);初期化直後も入れてみましたが、残念!
Rajkiran

1

パスワード編集テキストでパスワードの可視性を適用する場合は、コードを完成させます。

ハンドルを作成します[任意のドローアブルまたはチェックボックス]

クリック時またはチェック/チェック解除時に書き込み:

 if (edittext.getInputType() == (InputType.TYPE_CLASS_TEXT |
                    InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD )){

                edittext.setInputType(InputType.TYPE_CLASS_TEXT |
                        InputType.TYPE_TEXT_VARIATION_PASSWORD );
            }else{
                edittext.setInputType(InputType.TYPE_CLASS_TEXT |
                        InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD );
            }

この行を書くことを忘れないでください:

 edittext.setSelection(edittext.getText().length());

カーソルを行末にリセットします。


@PKRは実装のバディをチェックします。この場合はすぐに使用できます。:)
sud007

@ sud007は、Xamarin / visual Studioでif条件を記述する方法について何か考えがありますか?
sunil y 2017

1

チェックボックスで入力タイプを変更するので、次のようにしOnCheckedChangeListenerます。

passwordEdit.setInputType(InputType.TYPE_CLASS_TEXT| (isChecked? InputType.TYPE_TEXT_VARIATION_PASSWORD|~InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD : InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD));

そして、それは最終的に機能しました。

のブール問題のようです TYPE_TEXT_VARIATION_VISIBLE_PASSWORDです。フラグを反転すると、問題が修正されます。

あなたの場合:

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD|~InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

1

変換メソッドを使用します。

隠れる:

editText.transformationMethod = PasswordTransformationMethod.getInstance()

目に見える:

editText.transformationMethod = SingleLineTransformationMethod.getInstance()

それでおしまい。


0

@Rajkiranによって提供された正解についての追加コメントだけで、追加することができます

etPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);

ユーザーがキーボードの自動提案に煩わされないように、NORMAL入力状態に


0

ブロッククォート

最終int []カウント= {0};

    showandhide.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if(count[0] ==0)
            {
                password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
                count[0]++;
            }
            else {

                password.setInputType(InputType.TYPE_CLASS_TEXT |
                        InputType.TYPE_TEXT_VARIATION_PASSWORD);
                showandhide.setText("Hide");
                count[0]--;
            }

        }
    });

0

neeraj tEverton Fernandes Rosarioの回答に基づいて、私はKotlinで書きましたpassword。は、レイアウト内のEditTextのIDです。

// Show passwords' symbols.
private fun showPassword() {
    password.run {
        val cursorPosition = selectionStart
        transformationMethod = HideReturnsTransformationMethod.getInstance()
        setSelection(cursorPosition)
    }
}

// Show asterisks.
private fun hidePassword() {
    password.run {
        val cursorPosition = selectionStart
        transformationMethod = PasswordTransformationMethod.getInstance()
        setSelection(cursorPosition)
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.