Встановити inputType для EditText Programmatic?


216

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

mEdit.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

це, мабуть, не має ніякого ефекту.

Відповіді:


213

Згідно з документами TextView , програмною версією android: встановлюється парольTransformationMethod () , а не 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 з нулем або однорядкового трансформатора, таким чином очищаючи трансформатор пароля.
sparkym3

після виклику setTransformationMethod (PasswordTransformationMethod.getInstance ()) я не можу його відредагувати
sujith

але пароль з’явиться у запропонованому тексті при наступному використанні поля
Gary Davies

408

Для налаштування типу введення для EditText програмно потрібно вказати, що тип класу введення - це текст.

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

2
Ваша порада прекрасно працювала для мене! У мене була подібна проблема з програмним налаштуванням типу введення на багаторядковий.
Анна Лам

Яке значення має тут оператор бітового АБО? Вибачте, я новачок в android.
sanjeev

Я не погоджуюсь з InputType.TYPE_TEXT_VARIATION_PASSWORD для мене не працює, але встановлюєTraTransformationMethod (PasswordTransformationMethod.getInstance ()); робить!
Lluis Felisart

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) ;? Я спробував, і це не вийшло.
Невідомий користувач

15

Щоб дозволити лише цифри:

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

Щоб перетворити (приховати) пароль:

password1.setTransformationMethod(PasswordTransformationMethod.getInstance());

7
editText.setInputType(EditorInfo.TYPE_CLASS_NUMBER);

// Ви можете змінити TYPE _... відповідно до вашої вимоги.


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

Так, це робиться після будівництва, не впевнений, чому він теж не працює!
користувач246114

6
ця опція тепер застаріла !!
swiftBoy

ця річ лише одна, яка працює для старого Android 2.3, я відповів на це відповідь.
djdance

0

Я знаю, очікуваний відповідь є Java. Але ось мої 2 копійки поради завжди намагайтеся обробляти пов'язані з переглядом речі XML(як мінімум базові речі), тому я б запропонував скоріше використовувати xmlатрибут, а не обробляти цей випадок використання вjava

    <EditText
     android:inputType="textPassword"/>

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

1
але для цього в EditText є опція, яка дозволяє вам показувати / приховувати пароль, не потрібно робити це самостійно, також він дає хорошу анімацію для цього.
pratham kesarkar

дякую за інформацію, я бачив її тут 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.