Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android中的电话号码自动格式化_Android_Kotlin_Android Edittext_Phone Number_Android Textwatcher - Fatal编程技术网

android中的电话号码自动格式化

android中的电话号码自动格式化,android,kotlin,android-edittext,phone-number,android-textwatcher,Android,Kotlin,Android Edittext,Phone Number,Android Textwatcher,我需要在android中按照此格式设置编辑文本中的电话号码格式(222)222-2222 ext22222 我已经创建了一个监视程序,可以为我自动设置格式。watcher工作正常,电话号码格式正确。我唯一的问题是,当有人手动转到输入的手机中的其他位置并开始删除或添加号码时,自动格式化就不起作用了。 你知道如何处理这个问题吗。 以下是我当前的观察者的样子: editText.addTextChangedListener(object : TextWatcher { override fun

我需要在android中按照此格式设置编辑文本中的电话号码格式
(222)222-2222 ext22222
我已经创建了一个监视程序,可以为我自动设置格式。watcher工作正常,电话号码格式正确。我唯一的问题是,当有人手动转到输入的手机中的其他位置并开始删除或添加号码时,自动格式化就不起作用了。 你知道如何处理这个问题吗。 以下是我当前的观察者的样子:

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

您应该删除监视程序,以避免多次触发
posterextchanged
,并在设置方法文本后将其恢复

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功能保存一些工作

如果一切都取决于我,这就是我可以处理的方式(请参阅行间注释)。这仅用于电话号码格式设置,假设它是一个最多10位的地区号码:

phoneNumber.addTextChangedListener(新的TextWatcher(){
@凌驾
更改前文本之前的公共void(字符序列s、int start、int count、int after){
}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
}
@凌驾
公共无效后文本已更改(可编辑){
/*让我准备一个StringBuilder来保存编辑文本的所有数字*/
StringBuilder数字=新的StringBuilder();
/*这是将保存电话号码的电话StringBuilder*/
StringBuilder phone=新的StringBuilder();
/*让我们从编辑文本中提取所有字符*/
char[]chars=phoneNumber.getText().toString().ToCharray();
/*提取所有数字的循环*/
对于(int x=0;x=3){
/*我们的手机格式从第三个字符开始,以国家代码开始*/
字符串countryCode=新字符串();
/*我们建立国家代码*/
countryCode+=“(“+digits.toString().substring(0,3)+”);
/**我们将其附加到电话字符串生成器中**/
电话。附加(国家代码);
/**如果数字大于或仅为6,则意味着我们已经有了州代码/地区代码**/
if(digits.toString().length()>=6)
{
String regionCode=新字符串();
/**我们构建州/地区代码**/
regionCode+=digits.toString().子字符串(3,6)+“-”;
/**我们将地区代码附加到手机上**/
phone.append(regionCode);
/**电话号码不会超过12位如果是10位,请将限制设置为10位**/
if(digits.toString().length()>=10)
{
phone.append(digits.toString().substring(6,10));
}否则
{
phone.append(digits.toString().substring(6));
}
}否则
{
phone.append(digits.toString().substring(3));
}
/**移除观察者,这样你就不能捕捉到你将要做出的矫揉造作,以避免在文本更改上出现无限循环**/
removeTextChangedListener(此);
/**将新文本设置为编辑文本**/
phoneNumber.setText(phone.toString());
/**将光标移到输入的末尾**/
phoneNumber.setSelection(phoneNumber.getText().toString().length());
/*让观察者回来,继续倾听变化事件*/
phoneNumber.addTextChangedListener(此);
}否则{
返回;
}
}
});
每当用户更改EditText的值时,此代码将重新格式化电话号码。我自己测试过,它工作正常,不会崩溃。你可以测试


编辑:这是一段java代码,但我认为您可以轻松地将其重写为Kotlin

如果您没有注意到,问题在Kotlin中,您的答案在JavaI中。在连字符(-)出现后,我无法删除数字@GratienaSimbahWet答案只是一个简单的用例示例,但您可以编辑和支持更复杂的功能。您仍然可以通过将光标移到要删除的数字的正后方和连字符的前面来删除数字。@gratienasimba您找到连字符(-)之后删除的解决方案了吗?我也面临同样的问题。[这个链接可以帮助你