Программно изменить тип ввода EditText с ПАРОЛЯ на НОРМАЛЬНЫЙ и наоборот - PullRequest
170 голосов
/ 27 марта 2012

В моем приложении у меня есть EditText, чей тип ввода по умолчанию установлен на android:inputType="textPassword" по умолчанию.Он имеет CheckBox справа, то есть, когда отмечен, изменяет тип ввода этого EditText на NORMAL PLAIN TEXT.Код для этого

password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

Моя проблема в том, что когда этот флажок снят, он должен снова установить тип ввода на ПАРОЛЬ.Я сделал это, используя -

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

Но текст внутри этого текста редактирования все еще виден.И к удивлению, когда я меняю ориентацию, он автоматически устанавливает тип ввода на ПАРОЛЬ, а текст внутри маркируется (отображается как пароль).

Есть ли способ добиться этого?

Ответы [ 21 ]

3 голосов
/ 22 августа 2016

В библиотеку поддержки версии 24.2.0 была добавлена ​​функция переключения видимости пароля, позволяющая переключать пароль прямо с EditText без необходимости CheckBox.

. Вы можете сделать эту работув основном, сначала обновив версию вашей библиотеки поддержки до 24.2.0, а затем установив пароль inputType на TextInputEditText.Вот как это сделать:

<android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <android.support.design.widget.TextInputEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/password"
            android:inputType="textPassword"/>
</android.support.design.widget.TextInputLayout>

Более подробную информацию о новой функции можно найти в документации для разработчика для TextInputLayout .

.
3 голосов
/ 22 января 2015

Это полный обработчик onClick для изображения / кнопки, чтобы показать / скрыть пароль.

    new OnClickListener() {
        @Override
        public void onClick(View v) {
            // current ursor position
            int cursorPosition = edtPassword.getSelectionStart();

            // toggles the control variable
            isPassworsVisible = !isPassworsVisible;

            // sets the image toggler inside edit text
            passwordVisible.setImageDrawable(getResources().getDrawable(isPassworsVisible ? R.drawable.ic_eye_checked : R.drawable.ic_eye_unchecked));

            // apply input type
            edtPassword.setInputType(isPassworsVisible ? InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD : InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);

            // returns cursor to position
            edtPassword.setSelection(cursorPosition);
        }
    };
2 голосов
/ 10 июля 2014

некоторая динамическая ситуация holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER); не будет работать, поэтому лучше использовать оба варианта

holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);
holder.edit_pin.setTransformationMethod(PasswordTransformationMethod.getInstance());

Примечание: это подходит для случаев, когда вы используете динамические элементы управления, такие как arrayaapter

2 голосов
/ 02 сентября 2016

Мой поиск аналогичного решения для Visual Studio / Xamarin привел меня к этой теме. Ниже то, что работало для меня с Xamarin. Обратите внимание, что эта реализация сохраняет флаг TYPE_TEXT_FLAG_NO_SUGGESTIONS при переключении между режимами.

EditText et = FindViewById<EditText>(Resource.Id.ET);

Чтобы показать символы: et.InputType = Android.Text.InputTypes.TextVariationVisiblePassword | Android.Text.InputTypes.TextFlagNoSuggestions;

Чтобы скрыть символы: et.InputType = Android.Text.InputTypes.TextVariationPassword | Android.Text.InputTypes.ClassText;

Чтобы установить позицию до конца: int position = et.Text.Length; et.SetSelection(position, position);

2 голосов
/ 05 сентября 2018

После ввода setInputType для поля пароля у вас будет проблема с FONT
Вот мое решение для показа / скрытия пароля без проблем со шрифтом

protected void onCreate(Bundle savedInstanceState) {
    ...
    findViewById(R.id.button_show_hide_password).setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (isPasswordVisible(edtPassword)) {
                enableInputHiddenPassword(edtPassword);
            } else {
                enableInputVisiblePassword(edtPassword);
            }
            edtPassword.setSelection(edtPassword.getText().length());
        }
    });
}

final int INPUT_TYPE_VISIBLE_PASSWORD = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD;
final int INPUT_TYPE_HIDDEN_PASSWORD = InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD;

private boolean isPasswordVisible(EditText editText) {
    return editText.getInputType() == INPUT_TYPE_VISIBLE_PASSWORD;
}

private void enableInputVisiblePassword(EditText editText) {
    Typeface cache = editText.getTypeface();
    editText.setInputType(INPUT_TYPE_VISIBLE_PASSWORD);
    editText.setTypeface(cache);
}

private void enableInputHiddenPassword(EditText editText) {
    Typeface cache = editText.getTypeface();
    editText.setInputType(INPUT_TYPE_HIDDEN_PASSWORD);
    editText.setTypeface(cache);
}

Примечание: я использую InputType.TYPE_TEXT_VARIATION_PASSWORD вместо InputType.TYPE_CLASS_TEXT или HideReturnsTransformationMethod, потому что я хочу, чтобы клавиатура отображала как текст, так и число

DEMO

1 голос
/ 11 января 2017

Я изменяю тип ввода на своем флажке, поэтому на моем OnCheckedChangeListener я делаю:

passwordEdit.setInputType(InputType.TYPE_CLASS_TEXT| (isChecked? InputType.TYPE_TEXT_VARIATION_PASSWORD|~InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD : InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD));

И, наконец, это сработало.

Похоже, логическая проблема с TYPE_TEXT_VARIATION_VISIBLE_PASSWORD,Инвертируйте флаг, и это должно решить проблему.

В вашем случае:

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD|~InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
0 голосов
/ 10 апреля 2015

Завершите код, если вы хотите применить видимость пароля в тексте для редактирования пароля.

Создать дескриптор [Любая отрисовка или флажок]

при нажатии или при проверке / снятии отметки, напишите:

 if (edittext.getInputType() == (InputType.TYPE_CLASS_TEXT |
                    InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD )){

                edittext.setInputType(InputType.TYPE_CLASS_TEXT |
                        InputType.TYPE_TEXT_VARIATION_PASSWORD );
            }else{
                edittext.setInputType(InputType.TYPE_CLASS_TEXT |
                        InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD );
            }

Не забудьте написать эту строку:

 edittext.setSelection(edittext.getText().length());

Сбрасывает курсор в конец строки.

0 голосов
/ 29 июня 2016

Цитата

final int [] count = {0};

    showandhide.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if(count[0] ==0)
            {
                password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
                count[0]++;
            }
            else {

                password.setInputType(InputType.TYPE_CLASS_TEXT |
                        InputType.TYPE_TEXT_VARIATION_PASSWORD);
                showandhide.setText("Hide");
                count[0]--;
            }

        }
    });
0 голосов
/ 09 февраля 2015

Просто дополнительный комментарий к правильному ответу, предоставленному @Rajkiran, вы можете добавить

etPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);

в состояние ввода NORMAL, чтобы пользователи не раздражались самовнушением клавиатуры

0 голосов
/ 20 сентября 2018

На основе ответов neeraj t и Эвертон Фернандес Росарио Я написал в Kotlin, где password - это идентификатор EditText в вашем макете.

// Show passwords' symbols.
private fun showPassword() {
    password.run {
        val cursorPosition = selectionStart
        transformationMethod = HideReturnsTransformationMethod.getInstance()
        setSelection(cursorPosition)
    }
}

// Show asterisks.
private fun hidePassword() {
    password.run {
        val cursorPosition = selectionStart
        transformationMethod = PasswordTransformationMethod.getInstance()
        setSelection(cursorPosition)
    }
}
...