Ustawić program inputType dla EditText programowo?


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


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

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ż


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)


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

7
editText.setInputType(EditorInfo.TYPE_CLASS_NUMBER);

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


5

W przypadku Kotlin:

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

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!


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

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.


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

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

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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.