Отображение последнего символа пароля в EditText - PullRequest
6 голосов
/ 22 декабря 2011

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

Я попробовал несколько вещей:

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
password.setTransformationMethod(PasswordTransformationMethod.getInstance());
password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);

и установка типа ввода в xml.

Я тестировал только на Galaxy S2, так как это единственное устройство Android в моем офисе на данный момент, поэтому я не знаю, проблема ли это только с моим устройством.

редактирование: Только что протестировал на HTC Sensation от коллеги, и он работает так, как задумано на его телефоне, но остается вопрос, как получить эту же вещь на Galaxy S2?

Ответы [ 3 ]

16 голосов
/ 22 марта 2013

Прошло почти 1,5 года с тех пор, как это спросили: P. Но у меня было такое же требование, и я смог успешно его выполнить. Передайте объект класса MyTransformation в качестве параметра в setTransformationMethod, и все готово к работе :) Вот код.

public class MyTransformation extends PasswordTransformationMethod{

    @Override
    public CharSequence getTransformation(CharSequence source, View view) {
        return new PasswordCharSequence(source);
    }

    private class PasswordCharSequence implements CharSequence {
        private CharSequence mSource;
        public PasswordCharSequence(CharSequence source) {
            mSource = source; // Store char sequence
        }
        public char charAt(int index) {
        //This is the check which makes sure the last character is shown
            if(index != mSource.length()-1)
                return '•';
            else
                return mSource.charAt(index);
        }
        public int length() {
            return mSource.length(); // Return default
        }
        public CharSequence subSequence(int start, int end) {
            return mSource.subSequence(start, end); // Return default
        }
    }
}

enter image description here

1 голос
/ 27 апреля 2018

Улучшение ответа AndyFaizan , мое решение не отображает символы при использовании backspace. Без этого (простого) изменения можно будет раскрыть весь пароль, удалив символы в конце ввода.

public class CustomPasswordTransformation extends PasswordTransformationMethod {
    boolean lastActionWasDelete = false;

    @Override
    public CharSequence getTransformation(CharSequence source, View view) {
        return new PasswordCharSequence(source);
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        super.onTextChanged(s, start, before, count);
        this.lastActionWasDelete = before > count;
    }

    private class PasswordCharSequence implements CharSequence {
        private CharSequence source;

        PasswordCharSequence(CharSequence source) {
            this.source = source;
        }

        public char charAt(int index) {
            //This is the check which makes sure the last character is shown
            if (!lastActionWasDelete && index == source.length() - 1) return source.charAt(index);
            return '•';
        }

        public int length() {
            return source.length(); // Return default
        }

        public CharSequence subSequence(int start, int end) {
            return source.subSequence(start, end); // Return default
        }
    }
}
0 голосов
/ 19 декабря 2018

Как уже упоминалось ethan , пользователь может переключать режим отображения символов пароля в настройках безопасности системы.

Чтобы скрыть пароль, используйте

password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);

все остальное заботится операционной системой.

В моем случае я задавался вопросом о различном поведении на разных устройствах. После некоторого расследования на устройстве, на котором не отображался последний символ, была отключена настройка безопасности «Видимые пароли».

Если вы должны игнорировать общесистемную настройку, AndyFaizan решение по преобразованию пароля все еще в пути.

...