it-swarm.com.de

Ändern Sie programmgesteuert den Eingabetyp des EditText von PASSWORD in NORMAL und umgekehrt

In meiner Anwendung habe ich ein EditText, dessen Standardeingabetyp standardmäßig auf Android:inputType="textPassword" Gesetzt ist. Rechts davon befindet sich ein CheckBox. Wenn dieses Kontrollkästchen aktiviert ist, wird der Eingabetyp dieses EditText in NORMAL PLAIN TEXT geändert. Code dafür ist

password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

Mein Problem ist, wenn dieses Kontrollkästchen deaktiviert ist, sollte es den Eingabetyp erneut auf PASSWORD setzen. Ich habe es getan mit-

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

Der Text in diesem Edittext ist jedoch weiterhin sichtbar. Und wenn ich die Ausrichtung ändere, wird der Eingabetyp überraschenderweise automatisch auf PASSWORD gesetzt und der Text darin wird mit einem Aufzählungszeichen versehen (wie ein Kennwort angezeigt).

Wie kann man das erreichen?

173
Rajkiran

Nur für die Menschen, die das gleiche Problem haben. Fügen Sie diesem EditText einfach programmgesteuert ein zusätzliches Attribut hinzu, und schon sind Sie fertig.

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

Stellen Sie außerdem sicher, dass sich der Cursor an dem Ende des Texts in dem EditText befindet. Denn wenn Sie den Eingabetyp ändern, wird der Cursor automatisch auf den Startpunkt gesetzt. Daher empfehle ich den folgenden Code:

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

Bei Verwendung der Datenbindung können Sie den folgenden Code verwenden

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

Wenn Sie Kotlin verwenden,

password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
303
Rajkiran

verwenden Sie diesen Code, um das Kennwort in Text zu ändern und umgekehrt

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

den vollständigen Beispielcode finden Sie unter http://www.codeproject.com/Tips/518641/Show-hide-password-in-a-edit-text-view-password-ty

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

Die obige Methode hat bei mir nicht wirklich funktioniert. Antwort unten funktioniert für 2.2 sdk.

password.setTransformationMethod (PasswordTransformationMethod.getInstance ());

Setze inputType für einen EditText?

15
ymutlu

Ein weiteres einfaches Beispiel für die Verwendung von ImageView, um die Sichtbarkeit mit weniger Code umzuschalten, da wir nur den Gleichheitsoperator InputType zuweisen müssen:

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

Ersetzen:

InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD

Mit:

InputType.TYPE_CLASS_TEXT

Gibt das gleiche Ergebnis, aber kürzeres Wort.

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

Ok Also nach stundenlangem Ausprobieren endlich implementiert. Unten ist der Code ..

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

    }
});

Erklärungen: - Ich habe eine Schaltfläche mit Standardtext als Anzeige. Nach einem Klick auf das Ereignis wird geprüft, ob der Text der Schaltfläche angezeigt wird. Wenn es angezeigt wird, ändern Sie den Eingabetyp, indem Sie die Cursorposition anpassen und neuen Text als darin verstecken festlegen.

Wenn es ausgeblendet ist ... machen Sie es rückwärts, d. H. Verstecken Sie das Passwort, stellen Sie den Cursor ein und setzen Sie den Text auf "Anzeigen". Und das ist es. Es wirkt wie ein Zauber.

6
Debasish Ghosh

Das hat bei mir funktioniert:

mytext.setInputType(InputType.TYPE_CLASS_NUMBER);
5
mav_baumer15

Verwenden Sie diesen Code, um das Kennwort in Text und umgekehrt zu ändern. Dieser Code hat für mich perfekt funktioniert. Versuche dies..

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

}
});
5
Surya

Für Kotlin-Benutzer:

password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
5

Dies ist der vollständige onClick-Handler für das Image/den Button, um das Passwort anzuzeigen/auszublenden.

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

Die Funktion zum Umschalten der Kennwortsichtbarkeit wurde hinzugefügt, um die Bibliotheksversion 24.2.0 zu unterstützen, mit der Sie das Kennwort direkt von EditText aus umschalten können, ohne dass ein CheckBox erforderlich ist.

Sie können dies im Grunde tun, indem Sie zuerst Ihre Support-Bibliotheksversion auf 24.2.0 aktualisieren und dann ein inputType -Passwort für TextInputEditText festlegen. So geht's:

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

Weitere Informationen zu dieser neuen Funktion finden Sie in der Entwicklerdokumentation für TextInputLayout .

3
moyheen

Seit der Support Library v24.2.0. Sie können dies sehr einfach erreichen

Was Sie tun müssen, ist nur:

  1. Fügen Sie die Entwurfsbibliothek Ihren Abhängigkeiten hinzu

    dependencies {
         compile "com.Android.support:design:25.1.0"
    }
    
  2. Verwenden Sie TextInputEditText in Verbindung mit 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>
    

Das Attribut passwordToggleEnabled bewirkt, dass das Kennwort umgeschaltet wird

  1. Vergessen Sie in Ihrem Root-Layout nicht, xmlns:app="http://schemas.Android.com/apk/res-auto"

  2. Sie können Ihre Passwortumschaltung anpassen, indem Sie Folgendes verwenden:

app:passwordToggleDrawable - Kann als Symbol zum Umschalten der Sichtbarkeit bei der Kennworteingabe verwendet werden.
app:passwordToggleTint - Symbol zum Umschalten der Sichtbarkeit bei der Passworteingabe.
app:passwordToggleTintMode - Mischmodus zum Anwenden des Hintergrundfarbtons.

Weitere Details in TextInputLayout-Dokumentation . enter image description here

3
Javier Vieira

Meine Suche nach einer ähnlichen Lösung für Visual Studio/Xamarin führte mich zu diesem Thread. Nachfolgend sehen Sie, was bei mir mit Xamarin funktioniert hat. Beachten Sie, dass diese Implementierung das Flag TYPE_TEXT_FLAG_NO_SUGGESTIONS Behält, wenn Sie zwischen den Modi wechseln.

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

So zeigen Sie Zeichen an: et.InputType = Android.Text.InputTypes.TextVariationVisiblePassword | Android.Text.InputTypes.TextFlagNoSuggestions;

So blenden Sie Zeichen aus: et.InputType = Android.Text.InputTypes.TextVariationPassword | Android.Text.InputTypes.ClassText;

So legen Sie die Endposition fest: int position = et.Text.Length;et.SetSelection(position, position);

2
Tony

eine dynamische Situation holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER); wird nicht funktionieren, also benutze beide besser so

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

Hinweis: Dies ist geeignet, wenn Sie dynamische Steuerelemente wie arrayaapter verwenden

2
Issac Balaji

Nachdem Sie setInputType für ein Kennwortfeld eingegeben haben, haben Sie Problem mit [~ # ~] Schriftart [~ # ~]
Hier ist meine Lösung zum Ein-/Ausblenden des Passworts ohne Schriftartproblem

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

Anmerkung: Ich benutze InputType.TYPE_TEXT_VARIATION_PASSWORD anstatt InputType.TYPE_CLASS_TEXT oder HideReturnsTransformationMethod, weil die Tastatur sowohl Text als auch Nummer anzeigen soll

DEMO

2
Phan Van Linh

Ich ändere den Eingabetyp in meinem Kontrollkästchen, also in meinem OnCheckedChangeListener mache ich:

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

Und es hat endlich geklappt.

Scheint ein boolesches Problem mit TYPE_TEXT_VARIATION_VISIBLE_PASSWORD. Invertieren Sie das Flag und es sollte das Problem beheben.

In deinem Fall:

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

Vervollständigen Sie den Code, wenn Sie die Sichtbarkeit des Kennworts im Kennwortbearbeitungstext anwenden möchten.

Erstellen Sie ein Handle [Alle Zeichen oder Kontrollkästchen]

bei Klick oder bei Checked/Uncheck schreibe dies:

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

Vergessen Sie nicht, diese Zeile zu schreiben:

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

Der Cursor wird an das Zeilenende zurückgesetzt.

0
sud007

Blockquote

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]--;
            }

        }
    });

Basierend auf den Antworten von neeraj t und Everton Fernandes Rosario habe ich in Kotlin geschrieben, wobei password eine ID eines EditText in Ihrem Layout ist.

// 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

Möglicherweise möchten Sie nur einen zusätzlichen Kommentar zur richtigen Antwort von @Rajkiran hinzufügen

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

auf den NORMAL-Eingabestatus, damit die Benutzer nicht über den automatischen Vorschlag der Tastatur gestört werden

0
Z.J. Cong

Ich würde Android:inputType="textPassword" Aus Ihrem Layout entfernen. Aus diesem Grund wird bei einer Änderung der Ausrichtung wieder auf das Kennwort umgeschaltet. Da die Ansicht bei jeder Änderung der Ausrichtung neu erstellt wird.

Versuchen Sie Folgendes für das erste Problem:

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

entleeren Sie im Grunde den Text, bevor Sie den Eingabetyp ändern und ihn dann wieder hinzufügen.

0
bytebender