Автоматически добавлять тире в номер телефона в Android

Вместо 5118710 должно быть 511-8710. Я хотел бы добавить тире после того, как пользователь уже ввел 3 цифры в EditText. Максимальная длина EditText составляет только 7 цифр.

После того, как я разобрался с вышеуказанной проблемой, я снова застрял в кодировании. Когда я уже ввел 3 цифры, он добавляет тире (это то, что я хотел бы сделать), но моя проблема в том, что следующие 3 цифры также добавляют тире (например: 511-871-)... Пожалуйста помогите мне с этим. Благодарность!

    txt_HomeNo.addTextChangedListener(new TextWatcher() {

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

            boolean flag = true;
            String eachBlock[] = txt_HomeNo.getText().toString().split("-");
            for (int i = 0; i < eachBlock.length; i++) {
                if (eachBlock[i].length() > 3) {
                    flag = false;
                }
            }

            if (flag) {

                txt_HomeNo.setOnKeyListener(new OnKeyListener() {

                    @Override
                    public boolean onKey(View v, int keyCode, KeyEvent event) {

                        if (keyCode == KeyEvent.KEYCODE_DEL)
                            keyDel = 1;
                        return false;
                    }
                });

                if (keyDel == 0) {

                    if (((txt_HomeNo.getText().length() + 1) % 4) == 0) {

                        if (txt_HomeNo.getText().toString().split("-").length <= 3) {
                            txt_HomeNo.setText(txt_HomeNo.getText() + "-");
                            txt_HomeNo.setSelection(txt_HomeNo.getText().length());
                        }
                    }
                    a = txt_HomeNo.getText().toString();
                } else {
                    a = txt_HomeNo.getText().toString();
                    keyDel = 0;
                }

            } else {
                txt_HomeNo.setText(a);
            }

        }

person Community    schedule 07.06.2013    source источник
comment
Взгляните на ввод текста редактирования пользовательского формата   -  person neo108    schedule 07.06.2013
comment
Однако, спасибо @ neo108, как я могу сделать его похожим на 3-4 цифры, поскольку логика кода установлена ​​​​на 4-4 цифры?   -  person    schedule 07.06.2013
comment
Не могли бы вы опубликовать код, который у вас есть на данный момент для форматирования цифр.   -  person neo108    schedule 07.06.2013
comment
Привет, neo108, пожалуйста, обратитесь к моим кодам выше. Спасибо!   -  person    schedule 07.06.2013


Ответы (7)


Реализуйте следующие измененные addTextChangedListener для txt_HomeNo. Приведенный ниже код проверяет, равна ли длина введенного текста 3, и если да, то добавьте к нему -. Не очень надежное решение, но оно работает!

txt_HomeNo.addTextChangedListener(new TextWatcher() {

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

        txt_HomeNo.setOnKeyListener(new OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {

                if (keyCode == KeyEvent.KEYCODE_DEL)
                    keyDel = 1;
                return false;
            }
        });

        if (keyDel == 0) {
            int len = txt_HomeNo.getText().length();
            if(len == 3) {
                txt_HomeNo.setText(txt_HomeNo.getText() + "-");
                txt_HomeNo.setSelection(txt_HomeNo.getText().length());
            }
        } else {
            keyDel = 0;
        }
    }

    @Override
    public void afterTextChanged(Editable arg0) {
        // TODO Auto-generated method stub
    }

    @Override
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub
    }
});
person neo108    schedule 07.06.2013
comment
Еще раз спасибо Мастер @neo108 - person ; 07.06.2013
comment
Ницца! Мне удалось заставить это работать так, что если вы наберете 6 цифр в почтовом индексе, он вставит недостающий дефис. - person Phil; 28.10.2013
comment
Я пытаюсь реализовать этот код в своем приложении, но получаю ошибку Cannot Resolve Symbol 'keyDel' в своем коде. Я не вижу, где эта переменная объявлена ​​в приведенном выше фрагменте кода. Любая помощь в этом? - person Kevin Bright; 16.08.2016
comment
Я понял свою проблему. Вам нужно объявить переменную int keyDel в методе addTextChangedListener. Теперь это работает, хотя если вы добавите два дефиса и пробел через оба, дефисы не будут добавлены обратно должным образом. Например, я изменил if(len == 3) на if(len == 2 || len == 6), чтобы добавить дефис после 2-й и 6-й цифр. Это работает нормально, и даже Backspace работает нормально, если вы удалите только один дефис. Если вы удалите оба дефиса и начнете печатать снова, новый текст не добавит дефисы правильно. Если вы удалите все поле editText, дефисы будут работать. - person Kevin Bright; 02.09.2016
comment
Большое спасибо за добавление тире, но я также должен удалить пробел... пожалуйста, помогите мне в этом..... - person Bali; 05.12.2016
comment
но разные устройства KeyEvent.KEYCODE_DEL не поддерживаются. например, мое устройство Samsung работает, но asus не работает. - person Ramesh Kumar; 06.10.2017

Самое простое решение — использовать PhoneNumberFormattingTextWatcher, который отформатирует номер в соответствии с региональными настройками системы.

XML:

<EditText
    android:id="@+id/phone_number"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="@string/enter_phone_number"
    android:inputType="phone" />

Добавьте addTextChangedListener() в свой класс:

EditText phoneNumber = (EditText)findViewById(R.id.phone_number);
phoneNumber.addTextChangedListener(new PhoneNumberFormattingTextWatcher());
person ozbek    schedule 07.06.2013
comment
Но будет ли этот подход работать только в формате xxx-xxx-xxxx? - person mike20132013; 30.09.2015
comment
@ mike20132013, формат зависит от локали системы, используемой в настоящее время на целевом устройстве. - person ozbek; 01.10.2015
comment
Понял .. теперь имеет больше смысла. - person mike20132013; 02.10.2015
comment
Так многообещающе и легко реализуемо! - person Keith; 29.01.2019

У меня есть несколько небольших изменений в решении neo108, чтобы оно могло работать как с программной, так и с жесткой клавиатурой, например, в моем коде текст редактирования будет следовать правилу автоматического добавления «» в позиции 5 и 9.

txtPhone.addTextChangedListener(new TextWatcher() {

        int keyDel;

        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            txtPhone.setOnKeyListener(new View.OnKeyListener() {
                @Override
                public boolean onKey(View view, int keyCode, KeyEvent keyEvent) {
                    if (keyCode == KeyEvent.KEYCODE_DEL) {
                        keyDel = 1;
                    }
                    return false;
                }
            });

            String currentString = txtPhone.getText().toString();
            int currentLength = txtPhone.getText().length();

            if (currentLength == 5 || currentLength == 9) {
                keyDel = 1;
            }

            if (keyDel == 0) {
                if (currentLength == 4 || currentLength == 8) {
                    txtPhone.setText(txtPhone.getText() + " ");
                    txtPhone.setSelection(txtPhone.getText().length());
                }
            } else {
                if (currentLength != 5 && currentLength != 9) {
                    keyDel = 0;
                } else if ((currentLength == 5 || currentLength == 9)
                        && !" ".equals(currentString.substring(currentLength - 1, currentLength))) {
                    txtPhone.setText(currentString.substring(0, currentLength - 1) + " "
                            + currentString.substring(currentLength - 1, currentLength));
                    txtPhone.setSelection(txtPhone.getText().length());
                }
            }
        }
person Tùng Titan Trần    schedule 25.01.2017

Я реализовал пользовательский TextWatcher; это обрабатывает 10- и 11-значные телефонные номера (т.е. 1-555-867-5309 и 555-867-5309). Позволяет добавлять, удалять, вставлять, массово удалять, сохраняя при этом правильное положение курсора.

    public class CustomPhoneTextWatcher implements TextWatcher {

    private final EditText editText;
    private String previousString;

    public CustomPhoneTextWatcher(EditText editText) {
        this.editText = editText;
    }

    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

    }

    @Override
    public void afterTextChanged(Editable editable) {
        // if the previous editable ends with a dash and new is shorter than previous
        // additionally remove preceding character
        if (previousString != null && previousString.endsWith("-") && editable.toString().length() < previousString.length()) {
            previousString = editable.toString();
            String removedCharacterPriorToDash = editable.toString().substring(0, editable.length() - 1);
            editText.setText(removedCharacterPriorToDash);
            int position = editText.length();
            Editable etext = editText.getText();
            Selection.setSelection(etext, position);
        } else {
            previousString = editable.toString();
            String numericString = StringUtils.removeNonnumeric(editable.toString());
            int stringLength = numericString.length();
            boolean startsWithOne = numericString.startsWith("1");
            numericString = numericString.substring(0, Math.min(stringLength, 10 + (startsWithOne ? 1 : 0)));

            int lastHyphenIndex = 6 + (startsWithOne ? 1 : 0);
            int secondToLastHyphenIndex = 3 + (startsWithOne ? 1 : 0);

            if (stringLength >= lastHyphenIndex) {
                numericString = numericString.substring(0, lastHyphenIndex) + "-" + numericString.substring(lastHyphenIndex, numericString.length());
            }
            if (stringLength >= secondToLastHyphenIndex) {
                numericString = numericString.substring(0, secondToLastHyphenIndex) + "-" + numericString.substring(secondToLastHyphenIndex, numericString.length());
            }
            if (numericString.startsWith("1")) {
                numericString = numericString.substring(0, 1) + "-" + numericString.substring(1, numericString.length());
            }
            if (!numericString.equals(editable.toString())) {
                editText.setText(numericString);
                int position = editText.length();
                Editable etext = editText.getText();
                Selection.setSelection(etext, position);
            }
        }
    }
}

StringUtils.removeNonnumeric(editable.toString()) — это вызов этого метода:

   public static String removeNonnumeric(String text) {
        return text.replaceAll("[^\\d]", "");
    }
person Tom Howard    schedule 30.08.2017
comment
У этого есть пара проблем: 1) Если вы выберете «-» на клавиатуре, он удалит текст. Когда вы дойдете до случая пустой строки, он вылетит 2) Если вы удерживаете кнопку удаления, удаление прерывается. Я добавил реализацию, в которой я использовал часть вашего кода ниже, которая решила эти проблемы, с которыми я столкнулся. - person Ryan Newsom; 14.06.2018

Спасибо за все ответы выше.

  • editText.setOnKeyListener() никогда не будет вызываться, если на вашем устройстве есть только программная клавиатура.
  • Если строго следовать правилу добавления "-", то этот код не всегда показывает желаемый результат.

    editText.addTextChangedListener(new PhoneNumberFormattingTextWatcher());

но приведенный выше код является лучшим решением для форматирования номера телефона.

Помимо этого решения, я пишу код, который работает со всеми типами условий:

phoneNumber.addTextChangedListener(new TextWatcher() {
        @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) {
            if (len > phoneNumber.getText().length() ){
                len--;
                return;
            }
            len = phoneNumber.getText().length();

            if (len == 4 || len== 8) {
                String number = phoneNumber.getText().toString();
                String dash = number.charAt(number.length() - 1) == '-' ? "" : "-";
                number = number.substring(0, (len - 1)) + dash + number.substring((len - 1), number.length());
                phoneNumber.setText(number);
                phoneNumber.setSelection(number.length());
            }
        }
    });

эта строка кода требуется для добавления "-" на 3-ю и 6-ю позиции числа. если (длина == 4 || длина == 8)

person Raja    schedule 16.06.2016

Сделайте это самостоятельно, используя OnEditTextChangedListener, и вставьте тире, подсчитав количество символов, Подсчет символов в EditText Changed Listener

person Hesam    schedule 07.06.2013

person    schedule
comment
previousNumber выкинет NullPointerException - person Otieno Rowland; 02.05.2019