Android. Create phone number mask for EditText with TextWatcher.

Это простой пример по форматированию текста в формат “+7 123 456-78-90″ прямо во время ввода.
Формат и логику работы легко изменить по примеру.

Подключается всего лишь одной строчкой:

mUserPhone.addTextChangedListener(new PhoneNumberTextWatcher());

---------------------------------------------
package tk.ivpe.utils;

import android.text.Editable;
import android.text.TextWatcher;

import java.util.regex.Pattern;

/**
 * Created by evgen.ru79 on 07.04.2017.
 */

public class PhoneNumberTextWatcher implements TextWatcher {
    public static final int MAX_LENGTH = 16;

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    }

    @Override
    public void afterTextChanged(Editable s) {
        int i = 0;
        insertTo(s, i++, "+");
        deleteToDigit(s, i++);
        insertTo(s, i++, " ");
        deleteToDigit(s, i++);
        deleteToDigit(s, i++);
        deleteToDigit(s, i++);
        insertTo(s, i++, " ");
        deleteToDigit(s, i++);
        deleteToDigit(s, i++);
        deleteToDigit(s, i++);
        insertTo(s, i++, "-");
        deleteToDigit(s, i++);
        deleteToDigit(s, i++);
        insertTo(s, i++, "-");
        deleteToDigit(s, i++);
        for (; i < MAX_LENGTH + 1; ) {
            deleteToDigit(s, i++);
        }
        if (s.toString().length() > MAX_LENGTH)
            s.delete(s.toString().length() - 1, s.toString().length());
    }

    public void insertTo(Editable s, int i, String replaceChar) {
        if (s.toString().length() > i)
            if (!s.toString().substring(i, i + 1).equals(replaceChar))
                s.insert(i, replaceChar);
    }

    public void deleteToDigit(Editable s, int i) {
        Pattern isDigit = Pattern.compile("[\\d]");
        while (s.toString().length() > i) {
            if (!isDigit.matcher(s.toString().substring(i, i + 1)).matches()) {
                s.delete(i, i + 1);
            } else {
                break;
            }
        }
    }
}

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Facebook Auto Publish Powered By : XYZScripts.com