Программно изменить тип ввода 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 ]

299 голосов
/ 27 марта 2012

Только для людей, у которых такая же проблема.Просто добавьте дополнительный атрибут к этому 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
55 голосов
/ 01 октября 2013

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

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

15 голосов
/ 03 августа 2012
password.setInputType(InputType.TYPE_CLASS_TEXT | inputType.TYPE_TEXT_VARIATION_PASSWORD);

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

password.setTransformationMethod (PasswordTransformationMethod.getInstance ());

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

12 голосов
/ 09 июня 2015

Еще один простой пример использования 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

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

11 голосов
/ 09 декабря 2015
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 голосов
/ 08 ноября 2017

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

  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 на нем проверяется, отображается ли текст кнопки.Если это шоу, то измените тип ввода, отрегулируйте положение курсора и установите новый текст как скрытый в нем.

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

5 голосов
/ 08 ноября 2012

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

mytext.setInputType(InputType.TYPE_CLASS_NUMBER);
5 голосов
/ 14 августа 2018

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

password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
4 голосов
/ 18 февраля 2015

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

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

}
});
3 голосов
/ 15 декабря 2016

Поскольку библиотека поддержки v24.2.0. Вы можете достичь этого очень легко

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

  1. Добавить библиотеку дизайна в ваши зависимости

    dependencies {
         compile "com.android.support:design:25.1.0"
    }
    
  2. Используйте 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 . enter image description here

...