Установить inputType для EditText программно?


216

Как мы устанавливаем тип ввода для EditText программно? Я стараюсь:

mEdit.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

это, кажется, не имеет никакого эффекта.

Ответы:


213

Согласно документам TextView , программная версия android: пароль установлена setTransformationMethod () , а не setInputType (). Так что-то вроде:

mEdit.setTransformationMethod(PasswordTransformationMethod.getInstance());

должен сделать свое дело.


4
Просто чтобы добавить к этому, вам нужно вызвать setTransformationMethod вместо setInputType. Вызов setInputType после setTransformationMethod приводит к тому, что EditText больше не находится в режиме пароля.
Пол Риланд,

11
этот ответ неверен для задаваемого вопроса. Это только преобразует текст, введенный в EditText(заменяет символы точками пароля). Это никак не влияет на то, что разрешено вводить в EditTextсебя.
slinden77

4
setInputType в конечном счете вызывает setTransformationMethod изнутри, поэтому, если вы передадите TYPE_TEXT_VARIATION_PASSWORD в setInputType, он сделает это за вас. Кажется, проблема заключается в вызове setSingleLine после вызова setInputType, который вызовет setTransformationMethod со значением null или однострочным преобразователем, таким образом, очищая преобразователь пароля.
sparkym3

после вызова setTransformationMethod (PasswordTransformationMethod.getInstance ()) я не могу его редактировать
sujith s

но пароль появится в предложенном тексте при следующем использовании поля
Гэри Дэвис,

409

Для установки типа ввода для EditText программно, вы должны указать, что типом ввода является текст.

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

2
Ваш совет отлично сработал для меня! У меня была похожая проблема с программной установкой типа ввода на несколько строк.
Анна Лам

Каково значение наличия здесь побитового оператора ИЛИ? Извините, я новичок в Android.
sanjeev

Я не согласен, InputType.TYPE_TEXT_VARIATION_PASSWORD не работает для меня, но setTransformationMethod (PasswordTransformationMethod.getInstance ()); делает!
Луис Фелисарт

38

Вот различные типы ввода, как показано на стандартной клавиатуре.

типы ввода демо

Установка типа ввода программно

editText.setInputType(InputType.TYPE_CLASS_TEXT);

Другие варианты, кроме того, TYPE_CLASS_TEXTможно найти в документации .

Установка типа ввода в XML

<EditText
    android:inputType="text"
/>

Другие варианты, кроме того, textможно найти в документации .

Дополнительный код

Вот код для изображения выше.

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

Смотрите также


29

я решил все с

.setInputType(InputType.TYPE_CLASS_NUMBER);

чтобы увидеть четкие данные и

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

чтобы увидеть точки (если данные являются числом, это не выбор че другого класса)


Это сработало, спасибо! Один вопрос: зачем мне добавлять «или» при переходе от простого текста к типу пароля? Почему я не могу просто сделать это: .setInputType (InputType.TYPE_NUMBER_VARIATION_PASSWORD) ;? Я пытался, и это не сработало.
UnknownUser

15

Чтобы разрешить только номера:

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

Чтобы преобразовать (скрыть) пароль:

password1.setTransformationMethod(PasswordTransformationMethod.getInstance());

7
editText.setInputType(EditorInfo.TYPE_CLASS_NUMBER);

// вы можете изменить ТИП _... по вашему требованию.


5

Для Котлина:

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

4

Это может помочь другим, таким как я, которые хотят переключаться между паролем и режимом свободного текста. Я пытался использовать предложенные методы ввода, но это работало только в одном направлении. Я мог перейти от пароля к тексту, но потом я не мог вернуться. Для тех, кто пытается управлять переключателем (например, флажок показа пароля), используйте

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

Я должен отдать должное этому решению. Жаль, что я нашел это несколько часов назад!


1

Чтобы показать пароль:

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

Чтобы снова скрыть пароль:

editText.setTransformationMethod(PasswordTransformationMethod.getInstance());

0

Попробуйте добавить это к тегу EditText / TextView в макете

android:password="true"

Изменить: Я просто перечитал ваш пост, возможно, вам нужно сделать это после строительства. Я не понимаю, почему ваш фрагмент не сработает.


В этом случае у меня нет файла макета, поля создаются программно.
user246114

Да, это делается после строительства, не знаю, почему это тоже не работает!
user246114

6
эта опция сейчас устарела !!
swiftBoy

эта вещь только одна, которая работает для старого Android 2.3, я проголосовал за ответ.
djdance

0

Я знаю ожидаемый ответ Java. Но вот мои 2 цента совета всегда стараются обрабатывать связанные с просмотром вещи XML(по крайней мере, базовые вещи), поэтому я бы предложил использовать xmlатрибут, а не обрабатывать этот вариант использования вjava

    <EditText
     android:inputType="textPassword"/>

2
В некоторых случаях вы можете переключаться между различными типами ввода, например, скрывать / показывать пароль, введенный в поле; и это то, что позволило мне перейти на эту страницу
Уильям

1
но для этого в EditText есть опция, которая позволяет вам показывать / скрывать пароль без необходимости делать это самостоятельно, и это дает хорошую анимацию для этого.
Пратам Кесаркар

спасибо за информацию, я видел это здесь stackoverflow.com/a/41163578/3310235
Уильям

0

Спрятать:

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

Шоу:

edtPassword.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);                    
edtPassword.setTransformationMethod(PasswordTransformationMethod.getInstance());

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

Также вы должны быть осторожны, чтобы курсор перемещался в начальную точку editText после вызова этой функции, поэтому убедитесь, что вы снова переместите курсор в конечную точку.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.