Проблема с полем пароля Android, не скрывающим последний набранный символ - PullRequest
6 голосов
/ 15 июня 2011

В Android я создаю поле пароля следующим образом:

    EditText text = new EditText(context);
    text.setTransformationMethod(PasswordTransformationMethod.getInstance());

Или вот так, который, кажется, делает то же самое:

    EditText text = new EditText(context);
    text.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);

Я получаю хорошее поле пароля, за исключением последнего символа, набранного пользователем. Он виден на экране в течение нескольких секунд, а затем маскируется точкой.

Вот скриншот: enter image description here

Знаете, как исправить это поведение, пожалуйста?

Ответы [ 3 ]

11 голосов
/ 15 июня 2011

Это ожидаемое поведение. С помощью программных клавиатур на большинстве устройств очень важно, чтобы они правильно вводили пароль.

Для списка всех различных типов ввода, которые вы можете указать, и как они изменяют EditText,

см. android inputTypes .

Кроме того, можно изменить это поведение, внедрив свой собственный TransformationMethod и установив его с помощью setTransformationMethod(), но я бы не рекомендовал делать это. Пользователи будут ожидать поведения, которое вы наблюдаете, и, изменяя ваше приложение, вы будете получать непоследовательное взаимодействие с пользователем.

также проверьте эту статью для Android

10 голосов
/ 25 апреля 2013

Реализация TransformationMethod для скрытия последнего символа, введенного в пароле:

public class LoginActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // example of usage
    ((TextView) findViewById(R.id.password)).setTransformationMethod(new HiddenPassTransformationMethod());
}

private class HiddenPassTransformationMethod implements TransformationMethod {

    private char DOT = '\u2022';

    @Override
    public CharSequence getTransformation(final CharSequence charSequence, final View view) {
        return new PassCharSequence(charSequence);
    }

    @Override
    public void onFocusChanged(final View view, final CharSequence charSequence, final boolean b, final int i,
                               final Rect rect) {
        //nothing to do here
    }

    private class PassCharSequence implements CharSequence {

        private final CharSequence charSequence;

        public PassCharSequence(final CharSequence charSequence) {
            this.charSequence = charSequence;
        }

        @Override
        public char charAt(final int index) {
            return DOT;
        }

        @Override
        public int length() {
            return charSequence.length();
        }

        @Override
        public CharSequence subSequence(final int start, final int end) {
            return new PassCharSequence(charSequence.subSequence(start, end));
        }
    }
}
}
1 голос
/ 15 декабря 2011

Я столкнулся с этой проблемой после того, как мне пришлось реализовать пользовательский интерфейс типа пин-кода. После того, как пользователь ввел 1 число (соотношение 1: 1 между EditTexts и номерами выводов в общей сложности для 4 EditTexts), пароль останется «открытым». Моим решением было реализовать TextWatcher, который заменил бы ввод маркерами (& bull; s).

Полный ответ см. Здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...