InputType für einen EditText programmgesteuert festlegen?

216

Wie legen wir den Eingabetyp für einen EditText programmgesteuert fest? Ich versuche:

mEdit.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

es scheint keine Wirkung zu haben.

user246114
quelle

Antworten:

213

Gemäß den TextView-Dokumenten ist die programmatische Version von android: password setTransformationMethod () , nicht setInputType (). Also so etwas wie:

mEdit.setTransformationMethod(PasswordTransformationMethod.getInstance());

sollte den Trick machen.

Rascalking
quelle
4
Um dies hinzuzufügen, müssen Sie setTransformationMethod anstelle von setInputType aufrufen. Wenn Sie setInputType nach setTransformationMethod aufrufen, befindet sich der EditText nicht mehr im Kennwortmodus.
Paul Ryland
11
Diese Antwort ist falsch für die gestellte Frage. Dies transformiert nur den in eingegebenen Text EditText(ersetzt Zeichen durch Passwortpunkte). Dies hat keinerlei Auswirkung auf das, was in sich selbst eingegeben werden darf EditText.
Slinden77
4
setInputType ruft letztendlich setTransformationMethod von innen auf. Wenn Sie also TYPE_TEXT_VARIATION_PASSWORD an setInputType übergeben, wird dies für Sie erledigt. Das Problem scheint darin zu liegen, setSingleLine nach dem Aufruf von setInputType aufzurufen, das setTransformationMethod mit null oder dem einzeiligen Transformator aufruft, wodurch der Kennworttransformator gelöscht wird.
sparkym3
Nach dem Aufruf von setTransformationMethod (PasswordTransformationMethod.getInstance ()) kann ich es nicht bearbeiten
sujith s
Aber das Passwort wird bei der nächsten Verwendung des Feldes im vorgeschlagenen Text
Gary Davies
408

Um den Eingabetyp für einen EditText programmgesteuert festzulegen, müssen Sie angeben, dass der Eingabeklassentyp Text ist.

editPass.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
Amitku
quelle
2
Dein Tipp hat bei mir perfekt funktioniert! Ich hatte ein ähnliches Problem mit der programmgesteuerten Einstellung des Eingabetyps auf mehrzeilig.
Anna Lam
Welche Bedeutung hat es, hier einen bitweisen ODER-Operator zu haben? Entschuldigung, ich bin neu bei Android.
Sanjeev
Ich bin nicht einverstanden InputType.TYPE_TEXT_VARIATION_PASSWORD funktioniert nicht für mich, aber setTransformationMethod (PasswordTransformationMethod.getInstance ()); tut!
Lluis Felisart
37

Hier sind die verschiedenen Eingabetypen aufgeführt, die auf der Standardtastatur angezeigt werden.

Eingabetypen Demo

Programmierte Einstellung programmgesteuert

editText.setInputType(InputType.TYPE_CLASS_TEXT);

Weitere Optionen TYPE_CLASS_TEXTfinden Sie in der Dokumentation .

Festlegen des Eingabetyps in XML

<EditText
    android:inputType="text"
/>

Weitere Optionen textfinden Sie in der Dokumentation .

Ergänzungscode

Hier ist der Code für das Bild oben.

public class MainActivity extends AppCompatActivity {

    EditText editText;
    TextView textView;
    List<InputTypeItem> inputTypes;
    int counter = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = findViewById(R.id.editText);
        textView = findViewById(R.id.textView);
        initArray();
    }

    public void onChangeInputTypeButtonClick(View view) {
        if (counter >= inputTypes.size()) {
            startOver();
            return;
        }
        textView.setText(inputTypes.get(counter).name);
        editText.setInputType(inputTypes.get(counter).value);
        editText.setSelection(editText.getText().length());
        counter++;
    }

    private void startOver() {
        counter = 0;
        textView.setText("");
        editText.setInputType(InputType.TYPE_CLASS_TEXT);
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
    }


    private void initArray() {
        inputTypes = new ArrayList<>();
        inputTypes.add(new InputTypeItem("date",  InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_DATE));
        inputTypes.add(new InputTypeItem("datetime", InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_NORMAL));
        inputTypes.add(new InputTypeItem("none", InputType.TYPE_NULL));
        inputTypes.add(new InputTypeItem("number",  InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_NORMAL));
        inputTypes.add(new InputTypeItem("numberDecimal",  InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL));
        inputTypes.add(new InputTypeItem("numberPassword",  InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_VARIATION_PASSWORD));
        inputTypes.add(new InputTypeItem("numberSigned", InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_SIGNED));
        inputTypes.add(new InputTypeItem("phone",  InputType.TYPE_CLASS_PHONE));
        inputTypes.add(new InputTypeItem("text",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_NORMAL));
        inputTypes.add(new InputTypeItem("textAutoComplete", InputType.TYPE_TEXT_FLAG_AUTO_COMPLETE));
        inputTypes.add(new InputTypeItem("textAutoCorrect",  InputType.TYPE_TEXT_FLAG_AUTO_CORRECT));
        inputTypes.add(new InputTypeItem("textCapCharacters",  InputType.TYPE_TEXT_FLAG_CAP_CHARACTERS));
        inputTypes.add(new InputTypeItem("textCapSentences",  InputType.TYPE_TEXT_FLAG_CAP_SENTENCES));
        inputTypes.add(new InputTypeItem("textCapWords",  InputType.TYPE_TEXT_FLAG_CAP_WORDS));
        inputTypes.add(new InputTypeItem("textEmailAddress",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS));
        inputTypes.add(new InputTypeItem("textEmailSubject", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_EMAIL_SUBJECT));
        inputTypes.add(new InputTypeItem("textFilter",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_FILTER));
        inputTypes.add(new InputTypeItem("textLongMessage",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_LONG_MESSAGE));
        inputTypes.add(new InputTypeItem("textMultiLine",  InputType.TYPE_TEXT_FLAG_MULTI_LINE));
        inputTypes.add(new InputTypeItem("textNoSuggestions", InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS));
        inputTypes.add(new InputTypeItem("textPassword",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD));
        inputTypes.add(new InputTypeItem("textPersonName", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PERSON_NAME));
        inputTypes.add(new InputTypeItem("textPhonetic",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PHONETIC));
        inputTypes.add(new InputTypeItem("textPostalAddress", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_POSTAL_ADDRESS));
        inputTypes.add(new InputTypeItem("textShortMessage", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_SHORT_MESSAGE));
        inputTypes.add(new InputTypeItem("textUri",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_URI));
        inputTypes.add(new InputTypeItem("textVisiblePassword",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD));
        inputTypes.add(new InputTypeItem("textWebEditText",  InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EDIT_TEXT));
        inputTypes.add(new InputTypeItem("textWebEmailAddress", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS));
        inputTypes.add(new InputTypeItem("textWebPassword", InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_PASSWORD));
        inputTypes.add(new InputTypeItem("time", InputType.TYPE_CLASS_DATETIME | InputType.TYPE_DATETIME_VARIATION_TIME));
    }

    class InputTypeItem {
        private String name;
        private int value;
        InputTypeItem(String name, int value) {
            this.name = name;
            this.value = value;
        }
    }
}

Siehe auch

Suragch
quelle
29

Ich habe alle mit gelöst

.setInputType(InputType.TYPE_CLASS_NUMBER);

siehe klare Daten und

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

um die Punkte zu sehen (wenn die Daten eine Zahl sind, ist es keine Wahl für eine andere Klasse)

Geizkragen
quelle
Das hat funktioniert, danke! Eine Frage: Warum muss ich beim Wechsel vom Klartext zum Kennworttyp 'oder' hinzufügen? Warum kann ich das nicht einfach tun: .setInputType (InputType.TYPE_NUMBER_VARIATION_PASSWORD);? Ich habe es versucht und es hat nicht funktioniert.
UnknownUser
15

Um nur Zahlen zuzulassen:

password1.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_CLASS_NUMBER);

So transformieren (verbergen) Sie das Passwort:

password1.setTransformationMethod(PasswordTransformationMethod.getInstance());
slinden77
quelle
7
editText.setInputType(EditorInfo.TYPE_CLASS_NUMBER);

// Sie können TYPE _... entsprechend Ihren Anforderungen ändern.

Ajeet
quelle
5

Für Kotlin:

    val password = EditText(this)
    password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
    password.hint = "Password"
Ronen
quelle
4

Dies kann für andere wie mich hilfreich sein, die zwischen Passwort und Freitextmodus wechseln wollten. Ich habe versucht, die vorgeschlagenen Eingabemethoden zu verwenden, aber es hat nur in eine Richtung funktioniert. Ich konnte vom Passwort zum Text wechseln, aber dann konnte ich nicht zurückkehren. Für diejenigen, die versuchen, mit einem Umschalter umzugehen (z. B. ein Kontrollkästchen Kennwort anzeigen), verwenden Sie

       @Override
        public void onClick(View v)
        {
            if(check.isChecked())
            {
                edit.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                Log.i(TAG, "Show password");
            }
            else
            {
                edit.setTransformationMethod(PasswordTransformationMethod.getInstance());
                Log.i(TAG, "Hide password");
            }
        }

Ich muss dies für die Lösung gutschreiben. Ich wünschte, ich hätte das vor ein paar Stunden gefunden!

Brian Reinhold
quelle
1

So blenden Sie das Passwort ein:

editText.setInputType(
      InputType.TYPE_CLASS_TEXT|
      InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
);

So verstecken Sie das Passwort erneut:

editText.setTransformationMethod(PasswordTransformationMethod.getInstance());
Alif
quelle
0

Versuchen Sie, dies dem EditText / TextView-Tag in Ihrem Layout hinzuzufügen

android:password="true"

Bearbeiten: Ich habe gerade Ihren Beitrag noch einmal gelesen, vielleicht müssen Sie dies nach dem Bau tun. Ich verstehe nicht, warum Ihr Snippet nicht funktionieren würde.

Jim Blackler
quelle
Ich habe in diesem Fall keine Layoutdatei, die Felder werden programmgesteuert generiert.
user246114
Ja, es wird nach dem Bau gemacht, nicht sicher, warum es auch nicht funktioniert!
user246114
6
Diese Option ist jetzt veraltet !!
SwiftBoy
Dieses Ding ist nur eines, das für das alte Android 2.3 funktioniert. Ich habe die Antwort positiv bewertet.
DJDance
0

Ich weiß, dass die erwartete Antwort in ist Java. Aber hier sind meine 2 Cent Ratschläge, die immer versuchen, mit der Ansicht zusammenhängende XMLDinge in (zumindest grundlegende Sachen) zu behandeln, daher würde ich vorschlagen, lieber ein xmlAttribut zu verwenden, als diesen Anwendungsfall in zu behandelnjava

    <EditText
     android:inputType="textPassword"/>
Pratham Kesarkar
quelle
2
In einigen Fällen möchten Sie möglicherweise zwischen verschiedenen Eingabetypen wechseln, z. B. das Ausblenden / Anzeigen des in ein Feld eingegebenen Kennworts. Das ist es, was mich auf diese Seite gebracht hat
William
1
Dafür gibt es in EditText eine Option, mit der Sie das Passwort ein- und ausblenden können, ohne es selbst tun zu müssen. Außerdem gibt es dafür eine schöne Animation.
Pratham Kesarkar
danke für die Info, ich habe es hier gesehen stackoverflow.com/a/41163578/3310235
William
0

Ausblenden:

edtPassword.setInputType(InputType.TYPE_CLASS_TEXT);
edtPassword.setTransformationMethod(null);

Show:

edtPassword.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);                    
edtPassword.setTransformationMethod(PasswordTransformationMethod.getInstance());
Miragessee
quelle
0
password.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD);

Außerdem müssen Sie darauf achten, dass sich der Cursor nach dem Aufrufen dieser Funktion zum Startpunkt des editText bewegt. Stellen Sie daher sicher, dass Sie den Cursor erneut zum Endpunkt bewegen.

Vibhanshu Sharma
quelle
0
field.setInputType(InputType.TYPE_CLASS_TEXT);
Sailokesh Aithagoni
quelle