Программно измените тип ввода EditText с пароля на обычный и наоборот
в моем приложении, у меня есть EditText
чей тип ввода по умолчанию установлен в android:inputType="textPassword"
по deault. У него есть CheckBox
справа от него, когда он установлен, изменяет тип ввода этого EditText на обычный обычный текст. Код
password.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
моя проблема в том, что когда этот флажок снят, он должен снова установить тип ввода в PASSWORD. Я сделал это, используя-
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
но текст внутри этого edittext все еще виден. И для удивления, когда я меняю orienatation, он автоматически устанавливает тип ввода пароля, а текст внутри маркируется (отображается как пароль).
любой способ достичь этого?
21 ответов
как раз для людей которые имеют такую же проблему. Просто добавьте дополнительный атрибут к этому 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
используйте этот код, чтобы изменить пароль на текст и наоборот
mCbShowPwd.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// checkbox status is changed from uncheck to checked.
if (!isChecked) {
// show password
mEtPwd.setTransformationMethod(PasswordTransformationMethod.getInstance());
} else {
// hide password
mEtPwd.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
}
}
});
для полного кода образца см. http://www.codeproject.com/Tips/518641/Show-hide-password-in-a-edit-text-view-password-ty
password.setInputType(InputType.TYPE_CLASS_TEXT | inputType.TYPE_TEXT_VARIATION_PASSWORD);
выше метод не работает для меня. Ответ ниже работает для 2.2 sdk.
пароль.setTransformationMethod (PasswordTransformationMethod.getInstance ());
еще один простой пример использования 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
даст тот же результат, но более короткие слова.
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());
}
}
});
Ok, поэтому после нескольких часов попыток, наконец, реализовал его. Ниже приведен код ..
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 на нем проверяется, отображается ли текст кнопки. Если он отображается, измените тип ввода, отрегулируйте положение курсора и установите новый текст как скрыть в нем.
когда это скрыть... выполнение обратного, т. е. скрытие пароля, настройка курсора и настройка текста как показать. И это все. Это работает как по маслу.
для пользователей kotlin:
password.inputType = InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD
используйте этот код, чтобы изменить пароль на текст и наоборот. Этот код отлично сработал для меня. Попробовать это..
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);
}
}
});
функция переключения видимости пароля была добавлена в библиотеку поддержки версии 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.
Это полный обработчик 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);
}
};
мой поиск аналогичного решения для 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);
некоторая динамическая ситуация holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);
не будет работать, поэтому лучше использовать оба, что
holder.edit_pin.setInputType(InputType.TYPE_CLASS_NUMBER);
holder.edit_pin.setTransformationMethod(PasswordTransformationMethod.getInstance());
Примечание: это подходит для использования динамических элементов управления, таких как arrayaapter
С библиотеки поддержки v24.2.0. вы можете achivie это очень легко
что вам нужно сделать, это просто:
-
добавить библиотеку дизайна в dependecies
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
- Drawable для использования в качестве значка переключения видимости ввода пароля.app:passwordToggleTint
- значок для переключения видимости ввода пароля.app:passwordToggleTintMode
- режим смешивания, используемый для применения фонового оттенка.
Подробнее документация TextInputLayout.
Я меняю тип ввода на моем флажке, так что на моем 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);
Я бы убрал android:inputType="textPassword"
из вашего макета. Вот почему он переключается обратно на пароль при изменении ориентации. Потому что каждый раз, когда ориентация изменяется, представление воссоздается.
что касается первой проблемы, попробуйте это:
String text = password.getText();
password.setText("");
password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
password.setText(text);
в основном опорожнение текста перед изменением типа ввода, а затем добавить его обратно.
просто дополнительный комментарий к правильному ответу, предоставленному @Rajkiran, вы можете добавить
etPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);
в нормальное состояние ввода, чтобы пользователи не раздражались автоматическим предложением клавиатуры
полный код, если вы хотите применить видимость пароля в тексте редактирования пароля.
создать дескриптор [ любой drawable или флажок]
по щелчку или по галочке / снимите флажок напишите это:
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());
он сбрасывает курсор в конец строки.
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]--;
}
}
});
на основе ответов neeraj 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)
}
}