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


191

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

password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);

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

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

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

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


Как установить тип электронной почты для редактирования текста mailEdt.setInputType (InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_WEB_EMAIL_ADDRESS); не похоже на работу.
Махендран

5
Использование mailEdt.setInputType(InputType.TYPE_CLASS_TEXT|InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);. Работает для меня.
Раджкиран

Ответы:


347

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

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

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

password.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_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
как отмечено для правильного ответа - вместо изменения выбора вы можете использоватьInputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
mente

17
Я не понимаю, почему в мире Android предпочитает перемещать курсор, это просто усложняет жизнь разработчикам.
Рафаэль Санчес


2
Если пользователь редактирует середину поля пароля, это будет постоянно помещать курсор в конец. Я бы рекомендовал использовать editText.getSelectionStart()и editText.getSelectionEnd()с, setSelection(start, end)чтобы избежать этой проблемы.
JM Lord

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. Предложение Джоша также полезно. Это лучший ответ.
Ajay

Простые и лучшие спасибо
Сэм

1
Вы профессор мой друг! С этим решением вы не столкнетесь с проблемами со шрифтом после возврата в режим пароля (безопасный текст).
Цегенос

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

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

password.setTransformationMethod (PasswordTransformationMethod.getInstance ());

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


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 для Image / Button, чтобы показать / скрыть пароль.

    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- Drawable для использования в качестве значка переключения видимости ввода пароля.
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

Я имею в виду, как получить тип ввода текста редактирования в условии if () ..?
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в поле пароля, у вас будут проблемы с шрифтом
Вот мое решение для показать / скрыть пароль без проблемы шрифта

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

Используйте метод Transformation:

Прятаться:

editText.transformationMethod = PasswordTransformationMethod.getInstance()

Видимый:

editText.transformationMethod = SingleLineTransformationMethod.getInstance()

Вот и все.


0

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

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

в НОРМАЛЬНОЕ состояние ввода, так что пользователи не будут раздражены самовнушением клавиатуры


0

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

        }
    });

0

Основываясь на ответах 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)
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.