Есть ли умный способ позволить пользователю переключаться между скрытым и отображаемым паролем в андроиде EditText? Несколько приложений на базе ПК позволяют пользователю делать это.
Как переключаться между скрытым и отображаемым паролем
Ответ 1
Вы можете динамически изменять атрибуты TextView. Если вы установите для атрибута XML Atrribute android:password
значение true, представление будет показывать точки, если вы установите для него значение false, показывается текст.
С помощью метода setTransformationMethod вы сможете изменить эти атрибуты из кода. (Отказ от ответственности: я не проверял, работает ли метод по-прежнему после отображения представления. Если у вас возникли проблемы с этим, оставьте мне комментарий для меня, чтобы он знал.)
Полный образец кода будет
yourTextView.setTransformationMethod(new PasswordTransformationMethod());
чтобы скрыть пароль. Чтобы показать пароль, вы можете установить один из существующих методов трансформации или реализовать пустой TransformationMethod, который ничего не делает с текстом ввода.
yourTextView.setTransformationMethod(new DoNothingTransformation());
Ответ 2
Это действительно легко сделать, так как Support Library v24.2.0.
Что вам нужно сделать, это просто:
-
Добавьте библиотеку дизайна в ваши зависимости
dependencies { compile "com.android.support:design:24.2.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:layout_marginBottom="@dimen/login_spacing_bottom"> <android.support.design.widget.TextInputEditText android:id="@+id/etPassword" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/fragment_login_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.
Для AndroidX
-
Замените
android.support.design.widget.TextInputLayout
наcom.google.android.material.textfield.TextInputLayout
-
Замените
android.support.design.widget.TextInputEditText
наcom.google.android.material.textfield.TextInputEditText
Ответ 3
Чтобы показать точки вместо пароля, установите PasswordTransformationMethod:
yourEditText.setTransformationMethod(new PasswordTransformationMethod());
конечно, вы можете установить это по умолчанию в элементе edittext в макете xml с помощью
android:password
Чтобы повторно просмотреть читаемый пароль, просто передайте null как метод преобразования:
yourEditText.setTransformationMethod(null);
Ответ 4
Чтобы показать:
editText.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
Чтобы скрыть:
editText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
После каждого из них курсор reset, поэтому:
editText.setSelection(editText.length());
Ответ 5
Вы можете использовать app:passwordToggleEnabled="true"
вот пример, приведенный ниже
<android.support.design.widget.TextInputLayout
android:id="@+id/password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:passwordToggleEnabled="true"
android:textColorHint="@color/colorhint"
android:textColor="@color/colortext">
Ответ 6
Используйте флажок и соответствующим образом измените тип ввода.
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int start,end;
Log.i("inside checkbox chnge",""+isChecked);
if(!isChecked){
start=passWordEditText.getSelectionStart();
end=passWordEditText.getSelectionEnd();
passWordEditText.setTransformationMethod(new PasswordTransformationMethod());;
passWordEditText.setSelection(start,end);
}else{
start=passWordEditText.getSelectionStart();
end=passWordEditText.getSelectionEnd();
passWordEditText.setTransformationMethod(null);
passWordEditText.setSelection(start,end);
}
}
Ответ 7
Он работает для меня. Это поможет вам определенно
showpass.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(!isChecked){
// show password
password_login.setTransformationMethod(PasswordTransformationMethod.getInstance());
Log.i("checker", "true");
}
else{
Log.i("checker", "false");
// hide password
password_login.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
}
}
});
Ответ 8
private boolean isPasswordVisible;
private TextInputEditText firstEditText;
...
firstEditText = findViewById(R.id.et_first);
...
private void togglePassVisability() {
if (isPasswordVisible) {
String pass = firstEditText.getText().toString();
firstEditText.setTransformationMethod(PasswordTransformationMethod.getInstance());
firstEditText.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
firstEditText.setText(pass);
firstEditText.setSelection(pass.length());
} else {
String pass = firstEditText.getText().toString();
firstEditText.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
firstEditText.setInputType(InputType.TYPE_CLASS_TEXT);
firstEditText.setText(pass);
firstEditText.setSelection(pass.length());
}
isPasswordVisible= !isPasswordVisible;
}
Ответ 9
Я чувствую, что хочу ответить на этот вопрос, даже там хорошие ответы,
согласно документации TransformationMethod выполните нашу миссию
TransformationMethod
TextView использует TransformationMethods для выполнения таких действий, как замена символы паролей с точками или сохранение символов новой строки от разрыва строки в текстовых полях с одной строкой.
Уведомление Я использую масляный нож, но его то же самое, если проверка пользователя показывает пароль
@OnCheckedChanged(R.id.showpass)
public void onChecked(boolean checked){
if(checked){
et_password.setTransformationMethod(null);
}else {
et_password.setTransformationMethod(new PasswordTransformationMethod());
}
// cursor reset his position so we need set position to the end of text
et_password.setSelection(et_password.getText().length());
}
Ответ 10
Я могу добавить код ShowPassword/HidePassword всего несколькими строками, автономными в блоке:
protected void onCreate(Bundle savedInstanceState) {
...
etPassword = (EditText)findViewById(R.id.password);
etPassword.setTransformationMethod(new PasswordTransformationMethod()); // Hide password initially
checkBoxShowPwd = (CheckBox)findViewById(R.id.checkBoxShowPwd);
checkBoxShowPwd.setText(getString(R.string.label_show_password)); // Hide initially, but prompting "Show Password"
checkBoxShowPwd.setOnCheckedChangeListener( new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton arg0, boolean isChecked) {
if (isChecked) {
etPassword.setTransformationMethod(null); // Show password when box checked
checkBoxShowPwd.setText(getString(R.string.label_hide_password)); // Prompting "Hide Password"
} else {
etPassword.setTransformationMethod(new PasswordTransformationMethod()); // Hide password when box not checked
checkBoxShowPwd.setText(getString(R.string.label_show_password)); // Prompting "Show Password"
}
}
} );
...
Ответ 11
private int passwordNotVisible=1;
@Override
protected void onCreate(Bundle savedInstanceState) {
showPassword = (ImageView) findViewById(R.id.show_password);
showPassword.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText paswword = (EditText) findViewById(R.id.Password);
if (passwordNotVisible == 1) {
paswword.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
passwordNotVisible = 0;
} else {
paswword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
passwordNotVisible = 1;
}
paswword.setSelection(paswword.length());
}
});
}
Ответ 12
Вы можете использовать SHOW/HIDE пароль, используя следующий код:
XML CODE:
<EditText
android:id="@+id/etPassword"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="21dp"
android:layout_marginTop="14dp"
android:ems="10"
android:inputType="textPassword" >
<requestFocus />
</EditText>
<CheckBox
android:id="@+id/cbShowPwd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/etPassword"
android:layout_below="@+id/etPassword"
android:text="@string/show_pwd" />
JAVA CODE:
EditText mEtPwd;
CheckBox mCbShowPwd;
mEtPwd = (EditText) findViewById(R.id.etPassword);
mCbShowPwd = (CheckBox) findViewById(R.id.cbShowPwd);
mCbShowPwd.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
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());
}
}
});
Ответ 13
Вы пытались использовать setTransformationMethod? Он унаследован от TextView и хочет, чтобы в качестве параметра был параметр TransformationMethod.
Подробнее о TransformationMethods здесь.
В нем также есть некоторые интересные функции, такие как замена символов.
Ответ 14
Попробуйте https://github.com/maksim88/PasswordEditText проект в github. Вам даже не нужно менять код Java, используя его. Просто измените
EditText
тегдля
com.maksim88.passwordedittext.PasswordEditText
в вашем XML файле.
Ответ 15
показать и скрыть пароль Edit_Text с флажком
XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:inputType="textPassword"
android:id="@+id/edtPass"
android:textSize="20dp"
android:hint="password"
android:padding="20dp"
android:background="#efeaea"
android:layout_width="match_parent"
android:layout_margin="20dp"
android:layout_height="wrap_content" />
<CheckBox
android:background="#ff4"
android:layout_centerInParent="true"
android:textSize="25dp"
android:text="show password"
android:layout_below="@id/edtPass"
android:id="@+id/showPassword"
android:layout_marginTop="20dp"
android:layout_width="wrap_content"
android:gravity="top|right"
android:layout_height="wrap_content" />
</RelativeLayout>
код Java
package com.example.root.sql2;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.AppCompatCheckBox;
import android.support.v7.widget.Toolbar;
import android.text.method.HideReturnsTransformationMethod;
import android.text.method.PasswordTransformationMethod;
import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
public class password extends AppCompatActivity {
EditText password;
CheckBox show_hide_password;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hide);
findViewById();
show_hide_pass();
}//end onCreate
public void show_hide_pass(){
show_hide_password.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (!b){
// hide password
password.setTransformationMethod(PasswordTransformationMethod.getInstance());
}else{
// show password
password.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
}
}
});
} // end show_hide_pass
public void findViewById(){ // find ids ui and
password = (EditText) findViewById(R.id.edtPass);
show_hide_password = (CheckBox) findViewById(R.id.showPassword);
}//end findViewById
}// end class
Ответ 16
То, что я сделал, это
- Создайте текстовое представление редактирования и обычный текстовый вид
- Сделайте их совпадающими друг с другом с помощью макета ограничения (так же, как экран входа в приложение Facebook)
- Прикрепите onClickListener к нормальному текстовому виду, чтобы он соответствующим образом изменил тип ввода текстового вида редактирования (видимый/невидимый)
Вы можете проверить это видео для более подробных шагов и объяснений https://youtu.be/md3eVaRzdIM
Надеюсь, это поможет:)
Ответ 17
Вот мое решение без использования метода TextInputEditText и Transformation.
XML
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
style="@style/FormLabel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/username" />
<EditText
android:id="@+id/loginUsername"
style="@style/EditTextStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableLeft="@drawable/ic_person_outline_black_24dp"
android:drawableStart="@drawable/ic_person_outline_black_24dp"
android:inputType="textEmailAddress"
android:textColor="@color/black" />
<TextView
style="@style/FormLabel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@string/password" />
<EditText
android:id="@+id/loginPassword"
style="@style/EditTextStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableEnd="@drawable/ic_visibility_off_black_24dp"
android:drawableLeft="@drawable/ic_lock_outline_black_24dp"
android:drawableRight="@drawable/ic_visibility_off_black_24dp"
android:drawableStart="@drawable/ic_lock_outline_black_24dp"
android:inputType="textPassword"
android:textColor="@color/black" />
</LinearLayout>
Код Java
boolean VISIBLE_PASSWORD = false; //declare as global variable befor onCreate()
loginPassword = (EditText)findViewById(R.id.loginPassword);
loginPassword.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
final int DRAWABLE_LEFT = 0;
final int DRAWABLE_TOP = 1;
final int DRAWABLE_RIGHT = 2;
final int DRAWABLE_BOTTOM = 3;
if (event.getAction() == MotionEvent.ACTION_UP) {
if (event.getRawX() >= (loginPassword.getRight() - loginPassword.getCompoundDrawables()[DRAWABLE_RIGHT].getBounds().width())) {
// your action here
//Helper.toast(LoginActivity.this, "Toggle visibility");
if (VISIBLE_PASSWORD) {
VISIBLE_PASSWORD = false;
loginPassword.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
loginPassword.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_lock_outline_black_24dp, 0, R.drawable.ic_visibility_off_black_24dp, 0);
} else {
VISIBLE_PASSWORD = true;
loginPassword.setInputType(InputType.TYPE_CLASS_TEXT);
loginPassword.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_lock_outline_black_24dp, 0, R.drawable.ic_visibility_black_24dp, 0);
}
return false;
}
}
return false;
}
});
Ответ 18
скомпилировать 'com.android.support:appcompat-v7:24.2.0'
компилировать 'com.android.support:design:24.2.0'
в макете
android:inputType="textPassword"
Работает
Ответ 19
В XML делай так
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:orientation="vertical"
>
<RelativeLayout
android:id="@+id/REFReLayTellFriend"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
<EditText
android:id="@+id/etpass1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:bottomLeftRadius="10dp"
android:bottomRightRadius="50dp"
android:fontFamily="@font/frutiger"
android:gravity="start"
android:inputType="textPassword"
android:hint="@string/regpass_pass1"
android:padding="20dp"
android:paddingBottom="10dp"
android:textColor="#000000"
android:textColorHint="#d3d3d3"
android:textSize="14sp"
android:topLeftRadius="10dp"
android:topRightRadius="10dp"/>
<ImageButton
android:id="@+id/imgshowhide1"
android:layout_width="40dp"
android:layout_height="20dp"
android:layout_marginTop="20dp"
android:layout_marginRight="10dp"
android:background="@drawable/showpass"
android:layout_alignRight="@+id/etpass1"/>
</RelativeLayout>
boolean show=true;
//on image click inside password do this
if(show){
imgshowhide2.setBackgroundResource(0);
imgshowhide2.setBackgroundResource(R.drawable.hide);
etpass2.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
etpass2.setSelection(etpass2.getText().length());
show=false;
}else{
imgshowhide2.setBackgroundResource(0);
imgshowhide2.setBackgroundResource(R.drawable.showpass);
//etpass1.setInputType(InputType.TYPE_TEXT);
etpass2.setInputType(InputType.TYPE_CLASS_TEXT |
InputType.TYPE_TEXT_VARIATION_PASSWORD);
etpass2.setSelection(etpass2.getText().length());
show=true;
}
Ответ 20
Мое расширение Kotlin. пиши один раз используй везде
fun EditText.tooglePassWord() {
this.tag = !((this.tag ?: false) as Boolean)
this.inputType = if (this.tag as Boolean)
InputType.TYPE_TEXT_VARIATION_PASSWORD
else
(InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_VARIATION_PASSWORD)
this.setSelection(this.length()) }
Вы можете сохранить этот метод в любом файле и использовать его везде так, как это
ivShowPassword.click { etPassword.tooglePassWord() }
где ivShowPassword щелкают по изображению (глаз), а etPassword - Editext
Ответ 21
Согласно этому источнику, если вы перенесли свой проект на AndroidX, вы можете заменить
compile "com.android.support:design:24.2.0"
с
implementation "com.google.android.material:material:1.0.0"
Тогда все, что вам нужно сделать, это поместить приведенный ниже код в файл макета:
<com.google.android.material.textfield.TextInputLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:passwordToggleEnabled="true"
android:hint="@string/hint_text">
<com.google.android.material.textfield.TextInputEditText
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</com.google.android.material.textfield.TextInputLayout>
Более подробную информацию о материале TextInputLayout
можно найти здесь.
К этому источнику рекомендуется перейти на AndroidX из библиотеки поддержки Android:
AndroidX - это проект с открытым исходным кодом, который команда Android использует для разработки, тестирования, упаковки, версии и выпуска библиотек в Jetpack.
AndroidX - значительное улучшение оригинальной библиотеки поддержки Android. Как и библиотека поддержки, AndroidX поставляется отдельно от ОС Android и обеспечивает обратную совместимость между версиями Android. AndroidX полностью заменяет библиотеку поддержки, предоставляя функции четности и новые библиотеки. Кроме того, AndroidX включает в себя следующие функции:
Все пакеты в AndroidX живут в согласованном пространстве имен, начиная со строки androidx. Пакеты библиотеки поддержки были сопоставлены с соответствующими пакетами androidx. *. Полное сопоставление всех старых классов и артефактов сборки с новыми см. на странице "Рефакторинг пакетов".
В отличие от библиотеки поддержки, пакеты AndroidX поддерживаются и обновляются отдельно. Пакеты androidx используют строгое семантическое управление версиями, начиная с версии 1.0.0. Вы можете самостоятельно обновлять библиотеки AndroidX в своем проекте.
Все новые разработки библиотеки поддержки будут происходить в библиотеке AndroidX. Это включает в себя обслуживание оригинальных артефактов библиотеки поддержки и введение новых компонентов Jetpack.
Ответ 22
Хорошее решение Установите кнопку, затем используйте этот код:
public void showPassword(View v)
{
TextView showHideBtnText = (TextView) findViewById(R.id.textView1);
if(showHideBtnText.getText().toString().equals("Show Password")){
password.setTransformationMethod(null);
showHideBtnText.setText("Hide");
} else{
password.setTransformationMethod(new PasswordTransformationMethod());
showHideBtnText.setText("Show Password");
}
}
Ответ 23
Попробуй это:
Сначала определите флаг как глобальный:
private boolean isShowPassword = false;
И настройте слушателя на обработку нажатия на шоу и скрытия пароля:
imgPassword.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isShowPassword) {
etPassword.setTransformationMethod(new PasswordTransformationMethod());
imgPassword.setImageDrawable(getResources().getDrawable(R.drawable.ic_eye_hide));
isShowPassword = false;
}else{
etPassword.setTransformationMethod(null);
imgPassword.setImageDrawable(getResources().getDrawable(R.drawable.ic_eye_show));
isShowPassword = true;
}
}
});
Ответ 24
В очень простой форме:
private fun updatePasswordVisibility(editText: AppCompatEditText) {
if (editText.transformationMethod is PasswordTransformationMethod) {
editText.transformationMethod = null
} else {
editText.transformationMethod = PasswordTransformationMethod()
}
editText.setSelection(editText.length())
}
Надеюсь, поможет.
Ответ 25
if (inputPassword.getTransformationMethod() == PasswordTransformationMethod.getInstance()) {
//password is visible
inputPassword.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
}
else if(inputPassword.getTransformationMethod() == HideReturnsTransformationMethod.getInstance()) {
//password is hidden
inputPassword.setTransformationMethod(PasswordTransformationMethod.getInstance());
}