Автоматически форматировать номер телефона в EditText - PullRequest
10 голосов
/ 21 февраля 2011

В моем приложении пользователь должен ввести номер телефона в поле EditText в следующем формате:

1 (515) 555-5555

Я не хочу, чтобы пользователь вводил "(", ")" или "-" при вводе номера; Я хочу, чтобы эти символы добавлялись автоматически.

Например, предположим, что пользователь ввел 1 - скобка после «1» должна быть добавлена ​​автоматически, чтобы отображалось «1 (». И я хотел бы иметь аналогичную функциональность при удалении.

Я попытался установить текст в методе afterTextChanged интерфейса onTextWatcher, но он не работает; вместо этого это вызывает ошибку. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

11 голосов
/ 29 августа 2013

вы можете попробовать

editTextPhoneNumber.addTextChangedListener(new PhoneNumberFormattingTextWatcher());

Проверка PhoneNumnerFormattingTextWatxher

если вам нужна собственная реализация TextWatcher, вы можете использовать фоллинг appraoch:

import android.telephony.PhoneNumberFormattingTextWatcher;
import android.text.Editable;

/**
* Set this TextWatcher to EditText for Phone number
* formatting.
* 
* Along with this EditText should have
* 
* inputType= phone
* 
* maxLength=14    
*/
public class MyPhoneTextWatcher extends PhoneNumberFormattingTextWatcher {

private EditText editText;

/**
 * 
 * @param EditText
 *            to handle other events
 */
public MyPhoneTextWatcher(EditText editText) {
    // TODO Auto-generated constructor stub
    this.editText = editText;
}

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    // TODO Auto-generated method stub
    super.onTextChanged(s, start, before, count);

    //--- write your code here
}

@Override
public void beforeTextChanged(CharSequence s, int start, int count,
        int after) {
    // TODO Auto-generated method stub
    super.beforeTextChanged(s, start, count, after);
}

@Override
public synchronized void afterTextChanged(Editable s) {
    // TODO Auto-generated method stub
    super.afterTextChanged(s);
}

}
10 голосов
/ 23 февраля 2011

Вы, вероятно, столкнулись с проблемой, потому что afterTextChanged является повторным входом, то есть изменения, внесенные в текст, вызывают повторный вызов метода.

Если это проблема, одним из способов являетсясохранить флаг переменной экземпляра:

public class MyTextWatcher implements TextWatcher {
    private boolean isInAfterTextChanged;

    public synchronized void afterTextChanged(Editable text) {
       if (!isInAfterTextChanged) {
           isInAfterTextChanged = true;

           // TODO format code goes here

           isInAfterTextChanged = false;
       }
    }
}

В качестве альтернативы вы можете просто использовать PhoneNumberFormattingTextWatcher - он не выполняет форматирование, которое вы описали, но опять же, вы нечтобы сделать это, нужно многое сделать.

...