Автоматическое форматирование номера телефона в Android - PullRequest
0 голосов
/ 28 декабря 2018

Мне нужно отформатировать номер телефона в редактируемом тексте в Android согласно этому формату (222) 222-2222 ext222222 Я создал наблюдатель, который выполняет автоматическое форматирование для меня.Наблюдатель работает нормально и правильно форматирует номер телефона.Моя единственная проблема заключается в том, что когда кто-то вручную переходит на какую-то другую позицию внутри введенного телефона и начинает удалять или добавлять номера, тогда автоматическое форматирование не работает.Любые идеи, как идти с этим вопросом.Вот как выглядит мой текущий наблюдатель:

editText.addTextChangedListener(object : TextWatcher {
    override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}

    override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}

    override fun afterTextChanged(s: Editable) {
        val text = editText.text.toString()
        val textLength = editText.text.length
        if (text.endsWith("-") || text.endsWith(" ")) {
            return
        }
        if (textLength == 1) {
            if (!text.contains("(")) {
                editText.setText(StringBuilder(text).insert(text.length - 1, "(").toString())
                editText.setSelection(editText.text.length)
            }
        } else if (textLength == 5) {
            if (!text.contains(")")) {
                editText.setText(StringBuilder(text).insert(text.length - 1, ")").toString())
                editText.setSelection(editText.text.length)
            }
        } else if (textLength == 6) {
            editText.setText(StringBuilder(text).insert(text.length - 1, " ").toString())
            editText.setSelection(editText.text.length)
        } else if (textLength == 10) {
            if (!text.contains("-")) {
                editText.setText(StringBuilder(text).insert(text.length - 1, "-").toString())
                editText.setSelection(editText.text.length)
            }
        } else if (textLength == 15) {
            if (text.contains("-")) {
                editText.setText(StringBuilder(text).insert(text.length - 1, " ext").toString())
                editText.setSelection(editText.text.length)
            }
        }
    }
})

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Если бы все могло зависеть от меня, вот как я мог бы справиться с этим (см. Комментарии между строк).Это только для форматирования номера телефона, предположим, что это региональный номер с максимум 10 цифрами:

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) {

                /* Let me prepare a StringBuilder to hold all digits of the edit text */
                    StringBuilder digits = new StringBuilder();

                 /* this is the phone StringBuilder that will hold the phone number */

                    StringBuilder phone = new StringBuilder();

                 /* let's take all characters from the edit text */
                    char[] chars = phoneNumber.getText().toString().toCharArray();

                   /* a loop to extract all digits */
                    for (int x = 0; x < chars.length; x++) {
                        if (Character.isDigit(chars[x])) {
                            /* if its a digit append to digits string builder */
                            digits.append(chars[x]);
                        }
                    }


                    if (digits.toString().length() >=3) {
                        /* our phone formatting starts at the third character  and starts with the country code*/
                        String countryCode = new String();

                        /* we build the country code */
                        countryCode += "(" + digits.toString().substring(0, 3) + ") ";

                        /** and we append it to phone string builder **/
                        phone.append(countryCode);

                        /** if digits are more than or just 6, that means we already have our state code/region code **/
                        if (digits.toString().length()>=6)
                        {

                            String regionCode=new String();
                            /** we build the state/region code **/
                            regionCode+=digits.toString().substring(3,6)+"-";
                            /** we append the region code to phone **/
                            phone.append(regionCode);



                            /** the phone number will not go over 12 digits  if ten, set the limit to ten digits**/
                            if (digits.toString().length()>=10)
                            {
                                phone.append(digits.toString().substring(6,10));
                            }else
                            {
                                phone.append(digits.toString().substring(6));
                            }
                        }else
                        {
                            phone.append(digits.toString().substring(3));
                        }
                        /** remove the watcher  so you can not capture the affectation you are going to make, to avoid infinite loop on text change **/
                        phoneNumber.removeTextChangedListener(this);

                        /** set the new text to the EditText **/
                        phoneNumber.setText(phone.toString());
                        /** bring the cursor to the end of input **/
                        phoneNumber.setSelection(phoneNumber.getText().toString().length());
                        /* bring back the watcher and go on listening to change events */
                        phoneNumber.addTextChangedListener(this);

                    } else {
                        return;
                    }

            }
        });

Этот код будет переформатировать номер телефона каждый раз, когда пользователь изменяет значение EditText.Я сам его проверил и он работает и не вылетает.Вы можете проверить.

РЕДАКТИРОВАТЬ: это код Java, но я думаю, вы можете легко переписать его в Kotlin.

0 голосов
/ 29 декабря 2018

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

editText.addTextChangedListener(object : TextWatcher {
    override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
    override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}

    override fun afterTextChanged(editable: Editable) {
        val text = editText.text.toString()
        val textLength = editText.text.length

        if (text.endsWith("-") || text.endsWith(" ")) {
            return
        }

        if (textLength == 1) {
            if (!text.contains("(")) {
                setText(StringBuilder(text).insert(text.length - 1, "(").toString())
            }
        } else if (textLength == 5) {
            if (!text.contains(")")) {
                setText(StringBuilder(text).insert(text.length - 1, ")").toString())
            }
        } else if (textLength == 6) {
            setText(StringBuilder(text).insert(text.length - 1, " ").toString())
        } else if (textLength == 10) {
            if (!text.contains("-")) {
                setText(StringBuilder(text).insert(text.length - 1, "-").toString())
            }
        } else if (textLength == 15) {
            if (text.contains("-")) {
                setText(StringBuilder(text).insert(text.length - 1, " ext").toString())
            }
        }
    }

    private fun setText(text: String){
        editText.removeTextChangedListener(this)
        editText.editableText.replace(0, editText.text.length, text)
        editText.setSelection(text.length)
        editText.addTextChangedListener(this)
    }
})

После этих изменений все работает нормально, но вылетает в части ext (не относится к вашему вопросу).Кроме того, вы можете использовать libphonenumber AsYouType , чтобы сохранить некоторую работу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...