Программно изменить тип ввода 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
приведет к отображению пароля.
-
В корневом макете не забудьте добавить xmlns:app="http://schemas.android.com/apk/res-auto"
-
Вы можете настроить свой пароль, используя:
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)
}
}