Ustawić program inputType dla EditText programowo?

216

Jak programowo ustawić typ wejścia dla EditText? Próbuję:

mEdit.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

to nie wydaje się mieć żadnego efektu.

użytkownik246114
źródło

Odpowiedzi:

213

Zgodnie z dokumentami TextView programowa wersja Androida: hasło to setTransformationMethod () , a nie setInputType (). Więc coś takiego:

mEdit.setTransformationMethod(PasswordTransformationMethod.getInstance());

powinien załatwić sprawę.

rascalking
źródło
4
Aby dodać do tego, musisz wywołać setTransformationMethod zamiast setInputType. Wywołanie setInputType po setTransformationMethod powoduje, że EditText nie będzie ponownie w trybie hasła.
Paul Ryland
11
ta odpowiedź jest zła dla zadawanego pytania. To tylko przekształca tekst wprowadzony w EditText(zastępuje znaki kropkami hasła). Nie ma to żadnego wpływu na to, co można wprowadzić w EditTextsobie.
slinden77
4
setInputType ostatecznie wywołuje setTransformationMethod od wewnątrz, więc jeśli przekażesz TYPE_TEXT_VARIATION_PASSWORD do setInputType, zrobi to za Ciebie. Wydaje się, że problem polega na wywołaniu setSingleLine po wywołaniu setInputType, który wywoła setTransformationMethod z zerowym lub transformatorem jednowierszowym, usuwając w ten sposób transformator hasła.
sparkym3
po wywołaniu setTransformationMethod (PasswordTransformationMethod.getInstance ()) nie mogę go edytować
sujith
ale hasło pojawi się w sugerowanym tekście przy następnym użyciu pola
Gary Davies,
408

Aby programowo ustawić typ wejścia dla EditText, musisz określić, że typem klasy wejściowej jest tekst.

editPass.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
Amitku
źródło
2
Twoja wskazówka działała dla mnie idealnie! Miałem podobny problem z programowym ustawieniem typu wejścia na multilinię.
Anna Lam
Jakie jest znaczenie posiadania bitowego operatora OR? Przepraszam, jestem nowy w Androidzie.
sanjeev
Nie zgadzam się InputType.TYPE_TEXT_VARIATION_PASSWORD nie działa dla mnie, ale setTransformationMethod (PasswordTransformationMethod.getInstance ()); robi !
Lluis Felisart,
38

Oto różne typy danych wejściowych pokazane na standardowej klawiaturze.

typy danych wejściowych

Programowe ustawianie typu wejścia

editText.setInputType(InputType.TYPE_CLASS_TEXT);

Inne opcje TYPE_CLASS_TEXTmożna znaleźć w dokumentacji .

Ustawienie typu wejściowego w XML

<EditText
    android:inputType="text"
/>

Inne opcje textmożna znaleźć w dokumentacji .

Kod uzupełniający

Oto kod powyższego obrazu.

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

Zobacz też

Suragch
źródło
29

rozwiązałem wszystko

.setInputType(InputType.TYPE_CLASS_NUMBER);

zobacz jasne dane i

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

aby zobaczyć kropki (jeśli dane są liczbą, nie jest to wybór innej klasy)

sknera
źródło
To działało, dzięki! Jedno pytanie, dlaczego muszę dodawać „lub” podczas zmiany zwykłego tekstu na typ hasła? Dlaczego nie mogę tego po prostu zrobić: .setInputType (InputType.TYPE_NUMBER_VARIATION_PASSWORD) ;? Próbowałem i to nie działało.
Nieznany Użytkownik
15

Aby zezwolić tylko na liczby:

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

Aby przekształcić (ukryć) hasło:

password1.setTransformationMethod(PasswordTransformationMethod.getInstance());
slinden77
źródło
7
editText.setInputType(EditorInfo.TYPE_CLASS_NUMBER);

// możesz zmienić TYPE _... zgodnie ze swoimi wymaganiami.

Ajeet
źródło
5

W przypadku Kotlin:

    val password = EditText(this)
    password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
    password.hint = "Password"
Ronen
źródło
4

Może to być pomocne dla innych osób, takich jak ja, które chciały przełączać się między hasłem a trybem dowolnego tekstu. Próbowałem użyć sugerowanych metod wprowadzania, ale działało to tylko w jednym kierunku. Mogłem przejść od hasła do tekstu, ale potem nie mogłem przywrócić. Dla tych, którzy próbują obsłużyć przełącznik (np. Pole wyboru pokaż hasło) użyj

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

Muszę przypisać to rozwiązanie. Szkoda, że ​​nie znalazłem tego kilka godzin temu!

Brian Reinhold
źródło
1

Aby odkryć hasło:

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

Aby ponownie ukryć hasło:

editText.setTransformationMethod(PasswordTransformationMethod.getInstance());
Alif
źródło
0

Spróbuj dodać to do znacznika EditText / TextView w swoim układzie

android:password="true"

Edycja: Właśnie przeczytałem twój post, być może musisz to zrobić po zakończeniu budowy. Nie rozumiem, dlaczego Twój fragment kodu nie działa.

Jim Blackler
źródło
W tym przypadku nie mam pliku układu, pola są generowane programowo.
user246114
Tak, robi się to po zakończeniu budowy, nie jestem pewien, dlaczego to nie działa!
user246114
6
ta opcja jest teraz przestarzała !!
swiftBoy
ta rzecz jest tylko jedna, która działa na starym Androidzie 2.3. Poprosiłem o odpowiedź.
djdance
0

Wiem, że oczekiwana odpowiedź jest dostępna Java. Ale oto moje 2 centy porad zawsze starają się obsługiwać powiązane rzeczy w widoku XML(przynajmniej podstawowe rzeczy), więc sugerowałbym raczej użycie xmlatrybutu niż obsługę tego przypadku użycia wjava

    <EditText
     android:inputType="textPassword"/>
pratham kesarkar
źródło
2
W niektórych przypadkach możesz przełączać się między różnymi typami danych wejściowych, np. Ukrywanie / pokazywanie hasła wprowadzonego w polu; i to pozwala mi przejść do tej strony
William,
1
ale w tym celu istnieje opcja w EditText, która pozwala pokazać / ukryć hasło bez potrzeby robienia tego sam, a także daje ładną animację.
pratham kesarkar
dzięki za informację, widziałem to tutaj stackoverflow.com/a/41163578/3310235
William
0

Ukryć:

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

Pokazać:

edtPassword.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);                    
edtPassword.setTransformationMethod(PasswordTransformationMethod.getInstance());
miragessee
źródło
0
password.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD);

musisz także uważać, aby kursor przesuwał się do punktu początkowego editText po wywołaniu tej funkcji, więc upewnij się, że ponownie przesuwasz kursor do punktu końcowego.

Vibhanshu Sharma
źródło
0
field.setInputType(InputType.TYPE_CLASS_TEXT);
Sailokesh Aithagoni
źródło