knott
@knott

Трансформация текста в EditText?

Пытаюсь сделать форматирование текста во время его написания в Android.

Например номер телефона:
Я ввожу в EditText: +79032285588
А вижу: +7 (903) 227-55-88

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

public class PhoneNumberTransformationMethod implements TransformationMethod {

    public static final String TAG = "PhoneNumberTransformationMethod";


    @Override
    public CharSequence getTransformation(CharSequence source, View view) {
        // Такой странный код используется потому, что source — mutable.
        if (source instanceof Spanned) {
            Spanned spanned = (Spanned) source;
            return new PhoneNumberCharSequence(source);
        } else {
            return PhoneUtils.formatPhoneNumber(source.toString());
        }
    }

    @Override
    public void onFocusChanged(View view, CharSequence charSequence, boolean b, int i, Rect rect) {
    }

    private static class PhoneNumberCharSequence implements CharSequence {

        private HashMap<String, String> phoneNumbers = new HashMap<String, String>();
        private CharSequence mSource;

        public PhoneNumberCharSequence(CharSequence source) {
            mSource = source;
        }

        private String getCurrent() {
            String currentString = mSource.toString();

            String result = phoneNumbers.get(currentString);
            if (result == null) {
                result = PhoneUtils.formatPhoneNumber(currentString);
                phoneNumbers.put(currentString, result);
            }

            return result;
        }

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

        @Override
        public char charAt(int i) {
            return getCurrent().charAt(i);
        }

        @Override
        public CharSequence subSequence(int start, int end) {
            return new SpannedString(this).subSequence(start, end);
        }
    }
}


Проблема в том, что это не работает для случаев где не просто изменяются входные символы, но и добавляются новые. При вводе очередного символа из возвращаемого CharSequence берется только один символ, даже если форматер телефонного номера выдал несколько.

Можно ли заставить TextView (EditText) перечитать всю строку из моего CharSequence?
Или может быть какие-нибудь другие способы реализовать выше описанную задачу?

Заранее Большое спасибо!
  • Вопрос задан
  • 6771 просмотр
Решения вопроса 1
itspers
@itspers
Берет или готовый вотчер
EditText inputField = (EditText) findViewById(R.id.inputfield);
inputField.addTextChangedListener(new PhoneNumberFormattingTextWatcher());


или просто TextWatcher и форматируете там, как хочется stackoverflow.com/questions/15494093/phone-number-format-in-android
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы