Программно измените тип ввода 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 ());

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


еще один простой пример использования 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());       
                }
            }
        });

это сработало для меня:

mytext.setInputType(InputType.TYPE_CLASS_NUMBER);

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 это очень легко

что вам нужно сделать, это просто:

  1. добавить библиотеку дизайна в dependecies

    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. enter image description here


Я меняю тип ввода на моем флажке, так что на моем 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)
    }
}

после setInputType для поля пароля у вас будет