web-dev-qa-db-ja.com

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

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

password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

私の問題は、そのCheckBoxがチェックされていないとき、それは再びPASSWORDに入力タイプを設定するべきです。私はそれを使ってやった -

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

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

これを達成するための方法は?

168
Rajkiran

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

password.setInputType(InputType.TYPE_CLASS_TEXT |
    InputType.TYPE_TEXT_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
295
Rajkiran

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

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 を参照してください。

55
neeraj t
password.setInputType(InputType.TYPE_CLASS_TEXT | inputType.TYPE_TEXT_VARIATION_PASSWORD);

上記の方法は本当にうまくいきませんでした。以下の回答は2.2 sdkで動作します。

password.setTransformationMethod(PasswordTransformationMethod.getInstance());

EditTextにinputTypeを設定しますか?

15
ymutlu

単一の--- InputType割り当てのため、ImageViewを使用して、より少ないコードで表示を切り替える簡単な例をもう1つ示します。

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

同じ結果が得られますが、Wordは短くなります。

12
Roman Polen.
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());       
                }
            }
        });
11
G murali Madhav

それでは、何時間もかけてやっと実装しました。以下はコードです..

  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イベントの後、ボタンのテキストが表示されているかどうかを確認します。表示されている場合は、入力タイプを変更し、カーソル位置を調整して新しいテキストを非表示に設定します。

それが隠れているとき...逆にする、すなわちパスワードを隠し、カーソルを調整しそしてテキストを表示として設定する。以上です。それは魅力のように働いています。

6
Debasish Ghosh

これは私のために働いた:

mytext.setInputType(InputType.TYPE_CLASS_NUMBER);
5
mav_baumer15

コトリンユーザーの場合:

password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
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);
    }

}
});
4
Surya

これは、パスワードを表示/非表示にするImage/Buttonの完全な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);
        }
    };

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

基本的にサポートライブラリのバージョンを24.2.0に更新してからinputTypeにpasswordの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
moyheen

Support Library v24.2.0以降。これはとても簡単です。

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

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

    dependencies {
         compile "com.Android.support:design:25.1.0"
    }
    
  2. TextInputEditTextTextInputLayoutと組み合わせて使用​​する

    <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のドキュメント に詳細があります。 enter image description here

3
Javier Vieira

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);

2
Tony

いくつかの動的な状況holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);は動作しないでしょう。

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

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

2
Issac Balaji

パスワードフィールドに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またはHideReturnsTransformationMethodの代わりにInputType.TYPE_CLASS_TEXTを使用します。

DEMO

2
Phan Van Linh

チェックボックスで入力タイプを変更したので、私の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
Gugadin

パスワード編集テキストでパスワードの可視性を適用する場合は、完全なコードを使用してください。

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

クリックするか、チェックあり/チェックなしでこれを書いてください。

 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());

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

0
sud007

ブロッククォート

final int [] count = {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]--;
            }

        }
    });

neeraj t および Everton 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)
    }
}
0
CoolMind

@ Rajkiranが提供する正しい答えに関する追加のコメントだけで、追加することができます。

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

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

0
Z.J. Cong

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

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

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

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

0
bytebender