2014-04-08 15 views
5

Chciałbym edytować zawartość pola EditText za każdym razem, gdy użytkownik wpisze nową postać. Zasadniczo chcę sformatować numer telefonu za pomocą libphonenumber.Formatowanie numeru telefonu EditText jako typów użytkownika

Zaimplementowałem TextWatcher, który odczytuje treść pola i formatuje ją do formatu telefonu. Ale za każdym razem, gdy ustawiam tekst EditText z sformatowanym łańcuchem, watcher jest ponownie wywoływany, ustawia tekst jeszcze raz i utknie w nieskończonej pętli.

Jaki jest najlepszy lub właściwy sposób edycji tekstu jako typów użytkowników?

@Override 
public void afterTextChanged(Editable editable) { 
    if (editable.length() > 1) { 
     try { 
      PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance(); 
      PhoneNumber numberProto = phoneUtil.parse(editable.toString(), "BR"); 
      String formatted = phoneUtil.format(numberProto, PhoneNumberFormat.NATIONAL); 
      telephone.setText(formatted); 
     } catch (NumberParseException e) { 
      Log.d("Telefone", "NumberParseException was thrown: " + e.toString()); 
     } 
    } 
} 

Odpowiedz

4

Należy zachować ostrożność podczas wywoływania metody setText w aplikacji TextWatcher. W przeciwnym razie tworzysz nieskończoną pętlę, ponieważ zawsze zmieniasz tekst.

Można spróbować następujących jedynym ustawić tekst, jeśli jest naprawdę konieczne:

if(!telephone.getText().toString().equals(formatted)) { 
    telephone.setText(formatted); 
} 

Zamiast:

telephone.setText(formatted); 

ten sposób powinny być w stanie unikać stwarzania nieskończona pętla

+0

Jeśli mogę zadać inne pytanie, po zmianie tekstu kursor powraca do początku pola tekstowego. Jak mogę go zatrzymać na końcu? – Guilherme

+2

Wypróbuj tę odpowiedź na temat pozycjonowania kursora: http://stackoverflow.com/a/8035171/2399024 – donfuxx

Powiązane problemy