Próbuję użyć AsYouTypeFormatter z libphonanumber Google z TextWatcher i nie jestem pewien, czy jest to możliwe. Byłem w stanie sformatować tekst jako wpisany z pola EditText i wyprowadzić go w innym EditText, ale nie mogłem bezpośrednio zmienić oryginalnego pola EditText (czego chcę). Wiem o telefonieNumberFormattingTextWatcher, ale chcemy, aby użytkownik mógł ostatecznie wybrać, które locale są w nim i mieć większą kontrolę niż używanie tego, co pozwala (z tego, co zebrałem).Jak korzystać z AsYouTypeFormatter TextWatcher w aplikacji na Androida?
Top klasy:
private View phoneNumberView;
private EditText phoneNumberText;
private String formattedPhoneNumber;
private boolean isInAfterTextChanged;
private AsYouTypeFormatter aytf;
Najpierw zainicjować AsYouTypeFormatter na szczycie mojej klasy:
aytf = PhoneNumberUtil.getInstance().getAsYouTypeFormatter(Locale.getDefault().getCountry());
Po moich zakładkach i takie są tworzone, utworzyć pole EditText, formatowania istniejący numer telefonu wewnątrz (który działa) i dołącz odbiornik (który jest aktualną klasą):
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);
Wtedy to, co mam w tej chwili w mojej funkcji TextWatcher, nie jestem pewien, które z tych funkcji mój kod powinien być w choć:
@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) {
}
Oto próbka zalogowanych wyjścia, więc wiem formatowanie działa:
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
a oto obraz na wyjściu (top EditText jest phoneNumberText a dno jest testPhoneNumberText): http://imgur.com/GXwRu.png
Co chcę wiedzieć, w jaki sposób mogę uzyskać sformatowany wyjście z powrotem do źródła al EditText podczas pisania? Kiedy próbuję to zrobić, dziwne rzeczy dzieją się jak duplikowanie lub po prostu pokazuje to niesformatowane. Próbowałem używać s.replace(), ale nie jestem pewien, czy używam go poprawnie. czy to możliwe? Dzięki?
Dlaczego nie wystarczy użyć PhoneNumberFormattingTextWatcher (String countryCode) ??? http://stackoverflow.com/a/29109236/1103584 – DiscDev
To wymaga minSdkVersion 21 –