Програмно змінити тип введення EditText з PASSWORD на NORMAL та навпаки


191

У моїй програмі у мене є EditTextтиповий тип вводу, встановлений android:inputType="textPassword"за замовчуванням. Він має CheckBoxсвоє право, яке при перевірці змінює тип вводу цього EditText на ТЕКСТ NORMAL PLAIN TEXT. Код для цього є

password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

Моя проблема полягає в тому, що якщо цей CheckBox не встановлений, він знову повинен встановити тип введення PASSWORD. Я зробив це за допомогою-

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

Але текст усередині цього редакційного тексту все ще видно. І для здивування, коли я зміню оріонацію, вона автоматично встановлює тип введення на PASSWORD, а текст всередині буклет (відображається як пароль).

Будь-який спосіб досягти цього?


Як встановити тип електронної пошти для редагування тексту mailEdt.setInputType (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS); не здається, працює.
Mahendran

5
Використовуйте mailEdt.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);. Працює для мене.
Раджкіран

Відповіді:


346

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

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

Для числового пароля (PIN-коду).

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

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

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
як зазначається для правильної відповіді - замість зміни вибору ви можете використовуватиInputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
men

17
я не розумію, чому в світі андроїд вирішує перемістити курсор, це просто ускладнює життя розробників.
Рафаель Санчес


2
Якщо користувач редагує середину поля пароля, це буде постійно ставити курсор в кінці. Я рекомендую використовувати editText.getSelectionStart()та editText.getSelectionEnd()з, setSelection(start, end)щоб уникнути цієї проблеми.
Дж. Лорд

1
Люди навіть не повинні дивитись далі вниз. Це найкраща відповідь, і я б запропонував вам внести зміни, запропоновані @JM Lord.
Марк

56

використовуйте цей код, щоб змінити пароль на текст і навпаки

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


6
HideReturnsTransformationMethod.getInstance () показав пароль, а PasswordTransformationMethod.getInstance () приховав пароль ... реалізація правильна, але коментарі зворотні
Ахмед Адель Ісмаїл

2
Це найкраща відповідь, щоб завершити її, просто перемістіть курсор до останнього символу за допомогою: txtpassword.setSelection (txtpassword.getText (). Length ());
Джош

На мить, здається, це не працює через точку, виділену EL-conte De-monte TereBentikh. Пропозиція Джоша також корисна. Це найкраща відповідь.
Аджай

Найпростіші та найкращі задуми
Сем,

1
Ти професор, мій друг! З цим рішенням у вас не виникає проблем із шрифтом після повернення до режиму пароля (захищений текст).
Цегенос


12

Ще один простий приклад використання 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

Дасть такий же результат, але коротше слово.


12
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

Це працювало для мене:

mytext.setInputType(InputType.TYPE_CLASS_NUMBER);

Будь ласка, прочитайте запитання спочатку. Я хочу переключитися між полем пароля та текстовим полем. Це дасть мені числове текстове поле.
Раджкіран

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 на ній перевірте, чи відображається текст кнопки. Якщо воно відображається, то змінюйте тип введення, регулюючи положення курсору та встановлюючи новий текст як прихований у ньому.

Коли це приховується ... робиться зворотний, тобто приховує пароль, налаштовує курсор і встановлює текст як показ. І це все. Це працює як шарм.



5

Використовуйте цей код, щоб змінити пароль на текст і навпаки. Цей код прекрасно працював для мене. Спробуйте це..

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

Це повний обробник 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);
        }
    };

Дякуємо за edtPassword.getSelectionStart().
CoolMind

3

У підтримку бібліотеки версії 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

Оскільки Бібліотека підтримки 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 . введіть тут опис зображення


2

Мій пошук подібного рішення для 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);


як використовувати цей код 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 ); }для Visual Studio / Xamarin ..?
sunil y

я маю на увазі, як отримати вхідний тип редакції в умовах, якщо () ..?
sunil y

2

якась динамічна ситуація holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);не спрацює, тому краще використовувати обидві

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

Примітка. Це підходить, коли ви використовуєте динамічні елементи управління, як-от використання arrayaapter


2

Після 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

Я б видалив android:inputType="textPassword"із вашого макета. Ось чому він переходить до пароля, коли орієнтація змінюється. Тому що кожного разу, коли орієнтація змінюється, відтворення відтворюється.

Щодо першої проблеми, спробуйте це:

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

в основному випорожнення тексту перед тим, як змінити тип введення, а потім додати його назад.


Не працює. Я навіть спробував поставити password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);відразу після ініціалізації, але на жаль!
Раджкіран

1

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

Створення ручки

натисніть або на Повірено / Зніміть прапорець напишіть це:

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

Він скидає курсор до кінця рядка.


@PKR перевірити приятеля впровадження, який у цьому випадку готовий до використання! :)
sud007

@ sud007 Ви маєте будь-яку ідею, що як записати умова if у Xamarin / Visual Studio ..?
sunil y

1

Я змінюю тип введення в моєму прапорець, тому на своєму 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);

1

Використовуйте метод трансформації:

Ховатися:

editText.transformationMethod = PasswordTransformationMethod.getInstance()

До видимого:

editText.transformationMethod = SingleLineTransformationMethod.getInstance()

Це воно.


0

Ви можете додати лише додатковий коментар до правильної відповіді від @Rajkiran

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

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


0

Блок-котирування

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

На підставі відповідей неєрая t та Евертона Фернандеса Росаріо я написав у Котліні, де 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)
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.