Пытаюсь сделать форматирование текста во время его написания в 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
?
Или может быть какие-нибудь другие способы реализовать выше описанную задачу?
Заранее Большое спасибо!