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

190

In meiner Anwendung habe ich einen, EditTextdessen Standardeingabetyp android:inputType="textPassword"von deault eingestellt ist. Es hat eine CheckBoxauf ihr Recht, die , wenn sie aktiviert ist, ändert sich die Eingabetyp des EditText auf NORMAL KLARTEXT. Code dafür ist

password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

Mein Problem ist, wenn diese CheckBox deaktiviert ist, sollte sie den Eingabetyp wieder auf PASSWORD setzen. Ich habe es gemacht mit-

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

Der Text in diesem Edittext ist jedoch weiterhin sichtbar. Und überraschenderweise wird beim Ändern der Ausrichtung der Eingabetyp automatisch auf PASSWORT gesetzt, und der darin enthaltene Text wird mit Aufzählungszeichen versehen (wie ein Kennwort angezeigt).

Wie kann man das erreichen?

Rajkiran
quelle
Festlegen des E-Mail-Typs zum Bearbeiten von Text mailEdt.setInputType (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS); scheint nicht zu funktionieren.
Mahendran
5
Verwenden Sie mailEdt.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);. Funktioniert bei mir.
Rajkiran

Antworten:

346

Nur für die Leute, 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);

Für numerisches Passwort (PIN).

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

Stellen Sie außerdem sicher, dass sich der Cursor am Ende des Textes im EditText befindet. Denn wenn Sie den Eingabetyp ändern, wird der Cursor automatisch auf den Startpunkt gesetzt. Daher schlage ich vor, den folgenden Code zu verwenden:

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
Rajkiran
quelle
2
wie für die richtige Antwort angegeben - anstatt die Auswahl zu ändern, können Sie verwendenInputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
mente
17
Ich verstehe nicht, warum in der Welt Android den Cursor bewegt, es macht nur das Leben der Entwickler viel schwieriger.
Rafael Sanches
2
+1 für hier ist die beste Antwort
nAkhmedov
2
Wenn der Benutzer die Mitte des Kennwortfelds bearbeitet, wird der Cursor ständig an das Ende gesetzt. Ich würde empfehlen, editText.getSelectionStart()und editText.getSelectionEnd()mit setSelection(start, end)zu verwenden, um dieses Problem zu vermeiden.
JM Lord
1
Die Leute sollten nicht einmal weiter nach unten schauen. Dies ist die beste Antwort und würde vorschlagen, dass Sie die von @JM Lord vorgeschlagene Änderung vornehmen.
Mark
55

Verwenden Sie diesen Code, um das Passwort 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

neeraj t
quelle
6
HideReturnsTransformationMethod.getInstance () zeigte Passwort und PasswordTransformationMethod.getInstance () versteckte Passwort ... Implementierung ist korrekt, aber die Kommentare sind umgekehrt
Ahmed Adel Ismail
2
Dies ist die beste Antwort. Um dies zu vervollständigen, bewegen Sie den Cursor einfach auf das letzte Zeichen mit: txtpassword.setSelection (txtpassword.getText (). Length ());
Josh
Für einen Moment scheint es aufgrund des von EL-conte De-monte TereBentikh hervorgehobenen Punktes nicht zu funktionieren. Josh Vorschlag ist auch hilfreich. Dies ist die beste Antwort.
Ajay
Einfach und am besten danke
Sam
1
Du bist DER Professor, mein Freund! Mit dieser Lösung treten nach dem Zurückschalten in den Kennwortmodus (sicherer Text) keine Probleme mit der Schriftart auf.
Tzegenos
16
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 ());

InputType für einen EditText festlegen?

ymutlu
quelle
12

Ein weiteres einfaches Beispiel für die Verwendung von ImageView zum Umschalten der Sichtbarkeit mit weniger Code. Aufgrund der einzelnen Zuweisung von InputType benötigen wir nur den Gleichheitsoperator:

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.

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

Das hat bei mir funktioniert:

mytext.setInputType(InputType.TYPE_CLASS_NUMBER);
mav_baumer15
quelle
Bitte lesen Sie zuerst die Frage. Ich möchte zwischen Passwortfeld und Textfeld umschalten. Dies gibt mir ein numerisches Textfeld.
Rajkiran
6

Ok Also nach stundenlangem Versuch 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));
       }

    }
});

Erläuterungen: - Ich habe eine Schaltfläche mit Standardtext als Show. Nach dem Klicken auf das Ereignis wird überprüft, ob der Text der Schaltfläche angezeigt wird. Wenn es angezeigt wird, ändern Sie den Eingabetyp, passen Sie die Cursorposition an und setzen Sie neuen Text als darin ausgeblendet.

Wenn es ausgeblendet ist ... machen Sie es umgekehrt, dh verstecken Sie das Passwort, passen Sie den Cursor an und setzen Sie den Text wie gezeigt. Und das ist es. Es funktioniert wie ein Zauber.

Debasish Ghosh
quelle
6

Für Kotlin-Benutzer:

password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
Elisabeth Whiteley
quelle
Und das wird nur Passwortsymbole verbergen?
CoolMind
5

Verwenden Sie diesen Code, um das Passwort in Text zu ändern und umgekehrt. Dieser Code hat bei mir 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);
    }

}
});
Surya
quelle
Wie unterscheidet es sich von der akzeptierten Antwort? Bitte lesen Sie die Frage und die Antwort sorgfältig durch, bevor Sie Spam versenden.
Rajkiran
3

Dies ist der vollständige onClick-Handler für das Bild / die Schaltfläche zum Ein- / Ausblenden des Kennworts.

    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);
        }
    };
Everton Fernandes Rosario
quelle
Danke für edtPassword.getSelectionStart().
CoolMind
3

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 der umschalten können, EditTextohne dass ein erforderlich ist CheckBox.

Sie können dies im Grunde tun, indem Sie zuerst Ihre Support-Bibliotheksversion auf 24.2.0 aktualisieren und dann ein inputTypeKennwort für das festlegen TextInputEditText. 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 der neuen Funktion finden Sie in der Entwicklerdokumentation für TextInputLayout .

Moyheen
quelle
3

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 Designbibliothek Ihren Abhängigkeiten hinzu

    dependencies {
         compile "com.android.support:design:25.1.0"
    }
  2. Verwendung TextInputEditTextin Verbindung mitTextInputLayout

    <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 Durch das Attribut wird das Umschalten des Kennworts angezeigt

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

  2. Sie können Ihr Passwort umschalten, indem Sie Folgendes verwenden:

app:passwordToggleDrawable- Zeichnbar, um als Symbol für die Sichtbarkeit der Passworteingabe verwendet zu werden.
app:passwordToggleTint- Symbol zum Umschalten der Sichtbarkeit der Passworteingabe.
app:passwordToggleTintMode- Mischmodus zum Anwenden der Hintergrundfarbe.

Weitere Details finden Sie in der TextInputLayout-Dokumentation . Geben Sie hier die Bildbeschreibung ein

Javier Vieira
quelle
2

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 TYPE_TEXT_FLAG_NO_SUGGESTIONSbeim Umschalten zwischen den Modi das Flag beibehält .

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

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

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

So setzen Sie die Position auf Ende: int position = et.Text.Length; et.SetSelection(position, position);

Tony
quelle
Wie verwende 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 ); }ich diesen Code für Visual Studio / Xamarin?
Sunil y
Ich meine, wie man den Eingabetyp des Edittext in if () Bedingung bekommt ..?
Sunil y
2

Einige dynamische Situationen holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);funktionieren nicht, also nutzen Sie beide so besser

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

Issac Balaji
quelle
2

Nachdem Sie setInputTypeein Passwortfeld eingegeben haben, haben Sie ein Problem mit FONT.
Hier ist meine Lösung für das Ein- / Ausblenden von Passwörtern 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);
}

Hinweis: Ich verwende InputType.TYPE_TEXT_VARIATION_PASSWORDanstelle von InputType.TYPE_CLASS_TEXToder, HideReturnsTransformationMethodweil die Tastatur sowohl Text als auch Zahlen anzeigen soll

DEMO

Phan Van Linh
quelle
1

Ich würde entfernen android:inputType="textPassword" aus Ihrem Layout . Aus diesem Grund wird beim Ändern der Ausrichtung wieder auf das Kennwort umgeschaltet. Denn jedes Mal, wenn sich die Ausrichtung ändert, wird die Ansicht neu erstellt.

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.

Bytebender
quelle
Funktioniert nicht. Ich habe sogar versucht, password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);sofort nach der Initialisierung zu setzen, aber leider!
Rajkiran
1

Vervollständigen Sie den Code, wenn Sie die Kennwortsichtbarkeit im Text zum Bearbeiten von Kennwörtern anwenden möchten.

Erstellen Sie ein Handle [Beliebiges Zeichen- oder Kontrollkästchen]

Klicken Sie auf oder auf Aktiviert / Deaktiviert und schreiben Sie Folgendes:

 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 auf das Zeilenende zurückgesetzt.

sud007
quelle
@PKR Überprüfen Sie den Implementierungspartner, der in diesem Fall einsatzbereit ist! :)
sud007
@ sud007 Hast du eine Idee, wie man die if-Bedingung in Xamarin / Visual Studio schreibt?
Sunil y
1

Ich ändere den Eingabetyp in meinem Kontrollkästchen, also OnCheckedChangeListenermache ich Folgendes :

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

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);
Gugadin
quelle
1

Transformationsmethode verwenden:

Verstecken:

editText.transformationMethod = PasswordTransformationMethod.getInstance()

Zu sehen:

editText.transformationMethod = SingleLineTransformationMethod.getInstance()

Das ist es.

Benny
quelle
0

Nur ein zusätzlicher Kommentar zur richtigen Antwort von @Rajkiran, möchten Sie vielleicht hinzufügen

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

in den NORMAL-Eingabestatus, damit sich die Benutzer nicht über den automatischen Vorschlag der Tastatur ärgern

ZJ Cong
quelle
0

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

        }
    });
gattamaneni venkatanarasimham
quelle
0

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

// 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)
    }
}
CoolMind
quelle