Программно изменить тип ввода EditText с PASSWORD на NORMAL и наоборот

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

password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

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

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

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

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

Ответ 1

Просто для людей, у которых такая же проблема. Просто добавьте дополнительный атрибут к этому EditText программным путем, и все готово.

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

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

et_password.setInputType(InputType.TYPE_CLASS_TEXT | 
    InputType.TYPE_TEXT_VARIATION_PASSWORD);
et_password.setSelection(et_password.getText().length());

При использовании привязки данных вы можете использовать следующий код

<data>
        <import type="android.text.InputType"/>
.
.
.
<EditText
android:inputType='@{someViewModel.isMasked ? 
(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD) :
InputType.TYPE_CLASS_TEXT }'

При использовании Kotlin,

password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD

Ответ 2

используйте этот код, чтобы сменить пароль на текстовый и наоборот

mCbShowPwd.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // checkbox status is changed from uncheck to checked.
                if (!isChecked) {
                        // hide password
                    mEtPwd.setTransformationMethod(PasswordTransformationMethod.getInstance());
                } else {
                        // show password
                    mEtPwd.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
                }
            }
        });

полный пример кода см. http://www.codeproject.com/Tips/518641/Show-hide-password-in-a-edit-text-view-password-ty

Ответ 3

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

Метод выше не работает для меня. Ответ ниже работает для 2.2 sdk.

password.setTransformationMethod(PasswordTransformationMethod.getInstance());

Установить inputType для EditText?

Ответ 4

Еще один простой пример использования ImageView для переключения видимости с меньшим количеством кода из-за одиночного InputType присваивания нам нужен только оператор равенства:

EditText inputPassword = (EditText) findViewById(R.id.loginPassword);
ImageView inputPasswordShow = (ImageView) findViewById(R.id.imagePasswordShow);
inputPasswordShow.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View view) {
         if(inputPassword.getInputType() == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) {
              inputPassword.setInputType( InputType.TYPE_CLASS_TEXT |
                                        InputType.TYPE_TEXT_VARIATION_PASSWORD);
         }else {
              inputPassword.setInputType( InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD );
         }
         inputPassword.setSelection(inputPassword.getText().length());
    }
});

Замена:

InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD

С помощью:

InputType.TYPE_CLASS_TEXT

Дает тот же результат, но более короткое слово.

Ответ 5

Checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // checkbox status is checked.
                if (isChecked) {
                        //password is visible
 PasswordField.setTransformationMethod(HideReturnsTransformationMethod.getInstance());     
                } else {
                        //password gets hided
             passwordField.setTransformationMethod(PasswordTransformationMethod.getInstance());       
                }
            }
        });

Ответ 6

Итак, после нескольких часов попыток, наконец, реализовано. Ниже приведен код.

  buttons.get(2).setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View view) {
       if(buttons.get(2).getText().toString().equalsIgnoreCase(getResources().getString(R.string.show))){
           editTexts.get(1).setInputType(InputType.TYPE_CLASS_TEXT);
           editTexts.get(1).setSelection(editTexts.get(1).getText().length());
           buttons.get(2).setText(getResources().getString(R.string.hide));
        }else{
           editTexts.get(1).setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_PASSWORD);
           //editTexts.get(1).setTransformationMethod(PasswordTransformationMethod.getInstance());
           editTexts.get(1).setSelection(editTexts.get(1).getText().length());
           buttons.get(2).setText(getResources().getString(R.string.show));
       }

    }
});

Объяснения: - У меня есть кнопка с текстом по умолчанию в качестве показа. После события onclick на нем проверяется, отображается ли текст кнопки. Если он отображается, измените тип ввода, отрегулируйте положение курсора и установите новый текст как скрытый в нем.

Когда он скрыт... делает обратное, т.е. скрывает пароль, настраивает курсор и устанавливает текст как шоу. И это так. Он работает как шарм.

Ответ 7

Это сработало для меня:

mytext.setInputType(InputType.TYPE_CLASS_NUMBER);

Ответ 8

Используйте этот код, чтобы сменить пароль на текст и наоборот. Этот код отлично работал у меня. Попробуйте это.

EditText paswrd=(EditText)view.findViewById(R.id.paswrd);

CheckBox showpass=(CheckBox)view.findViewById(R.id.showpass);
showpass.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
    if(((CheckBox)v).isChecked()){
        paswrd.setInputType(InputType.TYPE_CLASS_TEXT);

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

}
});

Ответ 9

Для пользователей kotlin:

password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD

Ответ 10

Это полный обработчик 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);
        }
    };

Ответ 11

Функция поддержки видимости пароля была добавлена ​​для поддержки версии 24.2.0 библиотеки, позволяющей вам переключаться с паролем прямо с EditText без необходимости <<21 > .

Вы можете сделать эту работу в основном, сначала обновив версию своей поддержки до 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.

Ответ 12

Так как Библиотека поддержки v24.2.0. вы можете достичь этого очень легко

Что вам нужно сделать, просто:

  • Добавьте библиотеку дизайна к своим зависимостям

    dependencies {
         compile "com.android.support:design:25.1.0"
    }
    
  • Используйте TextInputEditText в сочетании с TextInputLayout

    <android.support.design.widget.TextInputLayout
        android:id="@+id/etPasswordLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:passwordToggleEnabled="true">
    
        <android.support.design.widget.TextInputEditText
            android:id="@+id/etPassword"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/password_hint"
            android:inputType="textPassword"/>
    </android.support.design.widget.TextInputLayout>
    
Атрибут

passwordToggleEnabled приведет к отображению пароля.

  1. В корневом макете не забудьте добавить xmlns:app="http://schemas.android.com/apk/res-auto"

  2. Вы можете настроить свой пароль, используя:

app:passwordToggleDrawable - Возможность использования в качестве значка переключения ввода пароля. app:passwordToggleTint - Значок, используемый для переключения видимости ввода пароля.
app:passwordToggleTintMode - Режим наложения, используемый для применения фонового оттенка.

Подробнее в Документация TextInputLayout. введите описание изображения здесь

Ответ 13

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

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

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

Ответ 14

Мой поиск аналогичного решения для Visual Studio/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);

Ответ 15

Я меняю тип ввода на свой флажок, поэтому на моем 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);

Ответ 16

Я удалю android:inputType="textPassword" из вашего макета. Именно поэтому он переключается обратно на пароль при изменении ориентации. Потому что каждый раз, когда ориентация меняется, вид воссоздается.

Что касается первой проблемы, попробуйте следующее:

String text = password.getText();
password.setText("");
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
password.setText(text);

в основном освобождая текст перед изменением типа ввода, а затем добавьте его обратно.

Ответ 17

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

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

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

Ответ 18

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

Создание дескриптора [Любые доступные или флажки]

при щелчке или при проверке/снятии отметьте:

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

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

Ответ 19

Blockquote

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

        }
    });

Ответ 20

После того, как вы 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

Ответ 21

Основываясь на ответах neeraj t и Everton Fernandes Rosario, я написал в 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)
    }
}