Я пытаюсь использовать AsYouTypeFormatter из libphonenumber Google с TextWatcher и не уверен, что это возможно. Мне удалось отформатировать текст, введенный из поля EditText, и вывести его в другом EditText, но я не смог напрямую изменить исходное поле EditText (это то, что я хочу). Я знаю о phoneNumberFormattingTextWatcher, но мы хотим, чтобы пользователь мог в конечном итоге выбрать, в какой локали он находится, и иметь больше контроля, чем это позволяет (из того, что я собрал).
Лучшие в классе:
private View phoneNumberView;
private EditText phoneNumberText;
private String formattedPhoneNumber;
private boolean isInAfterTextChanged;
private AsYouTypeFormatter aytf;
Сначала я инициализирую AsYouTypeFormatter вверху своего класса:
aytf = PhoneNumberUtil.getInstance().getAsYouTypeFormatter(Locale.getDefault().getCountry());
После того, как мои вкладки и тому подобное созданы, я создаю поле EditText, форматирую внутри него существующий номер телефона (который работает) и присоединяю прослушиватель (который является текущим классом):
phoneNumberView = inflater.inflate(R.layout.phone_number_setting, null);
phoneNumberText = (EditText) phoneNumberView.findViewById(R.id.dirty_phone_number);
phoneNumberText.setText(dirtyPhoneNumber);
for (int i = 0; i < dirtyPhoneNumber.length(); i++){
phoneNumberText.setText(aytf.inputDigit(dirtyPhoneNumber.charAt(i)));
}
aytf.clear();
phoneNumberText.setText(dirtyPhoneNumber);
phoneNumberText.addTextChangedListener(this);
Тогда это то, что у меня есть на данный момент в моих функциях TextWatcher, но я не уверен, в какой из этих функций должен быть мой код:
@Override
public void afterTextChanged(Editable s) {
if (!isInAfterTextChanged) {
isInAfterTextChanged = true;
if(s.length() > 0){
Log.v("AsYouTypeFormatter - source", s.toString());
for(int i = 0; i < s.length(); i++){
formattedPhoneNumber = aytf.inputDigit(s.charAt(i));
Log.v("AsYouTypeFormatter - formatted", formattedPhoneNumber);
}
Log.v("AsYouTypeFormatter - source after loop", s.toString());
//The formatted output shows properly in this EditText but not when I try to put it back into the original one (phoneNumberText)
EditText testPhoneNumberText = (EditText) phoneNumberView.findViewById(R.id.testPhoneNumberText);
testPhoneNumberText.setText(formattedPhoneNumber);
aytf.clear();
}
formattedPhoneNumber = null;
isInAfterTextChanged = false;
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
Вот пример зарегистрированного вывода, поэтому я знаю, что форматирование работает:
01-03 10:55:02.838: V/AsYouTypeFormatter - source(27114): 15552451234
01-03 10:55:02.838: V/AsYouTypeFormatter - formatted(27114): 1
01-03 10:55:02.838: V/AsYouTypeFormatter - formatted(27114): 15
01-03 10:55:02.838: V/AsYouTypeFormatter - formatted(27114): 1 55
01-03 10:55:02.838: V/AsYouTypeFormatter - formatted(27114): 1 555
01-03 10:55:02.838: V/AsYouTypeFormatter - formatted(27114): 1 555-2
01-03 10:55:02.838: V/AsYouTypeFormatter - formatted(27114): 1 555-24
01-03 10:55:02.850: V/AsYouTypeFormatter - formatted(27114): 1 555-245
01-03 10:55:02.850: V/AsYouTypeFormatter - formatted(27114): 1 555-245-1
01-03 10:55:02.850: V/AsYouTypeFormatter - formatted(27114): 1 555-245-12
01-03 10:55:02.850: V/AsYouTypeFormatter - formatted(27114): 1 555-245-123
01-03 10:55:02.850: V/AsYouTypeFormatter - formatted(27114): 1 555-245-1234
01-03 10:55:02.850: V/AsYouTypeFormatter - source after loop(27114): 15552451234
И вот изображение вывода (верхний EditText — это phoneNumberText, а нижний — testPhoneNumberText): https://imgur.com/GXwRu.png
Что я хочу знать, так это то, как мне вернуть отформатированный вывод в исходный EditText по мере его ввода? Когда я пытаюсь это сделать, происходят странные вещи, такие как дублирование или просто показывается неформатированный. Я пробовал использовать s.replace(), но не уверен, что правильно его использую. Это возможно? Спасибо?