在Android中自动添加短划线电话号码

在Android中自动添加短划线电话号码,android,textwatcher,Android,Textwatcher,而不是5118710,它应该是511-8710。我想在用户之后加一个破折号,用户在编辑文本中已经输入了3位数字。编辑文本的最大长度仅为7位 在我解决了上述问题后,我又陷入了编码的困境。当我已经输入了3位数字时,它会附加破折号(这是我希望发生的事情),但我的问题是接下来的3位数字也会附加破折号(如下:511-871-)。。。请帮我做这个。谢谢 txt_HomeNo.addTextChangedListener(new TextWatcher() { @Override

而不是5118710,它应该是511-8710。我想在用户之后加一个破折号,用户在编辑文本中已经输入了3位数字。编辑文本的最大长度仅为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);
            }

        }
txt\u HomeNo.addTextChangedListener(新的TextWatcher(){
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
布尔标志=真;
字符串eachBlock[]=txt_HomeNo.getText().toString().split(“-”);
for(int i=0;i3){
flag=false;
}
}
国际单项体育联合会(旗){
txt_HomeNo.setOnKeyListener(新的OnKeyListener(){
@凌驾
公共布尔onKey(视图v、int keyCode、KeyEvent事件){
if(keyCode==KeyEvent.keyCode_DEL)
keyDel=1;
返回false;
}
});
如果(keyDel==0){
如果((txt_HomeNo.getText().length()+1)%4)=0){

如果(txt_HomeNo.getText().toString().split(“-”).length自己使用OnEditTextChangedListener并通过计算字符数插入破折号,

最简单的解决方案是使用根据系统区域设置格式化数字的方法

XML:


txt\u HomeNo
实现以下修改的
addTextChangedListener
。下面的代码检查输入的文本长度是否为3,如果为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
    }
});

谢谢你的回答

  • 当您的设备只有软键盘时,editText.setOnKeyListener()将永远不会调用
  • 如果我们严格按照规则添加“-”,那么此代码并不总是显示期望的结果

    editText.addTextChangedListener(新电话号码格式TextWatcher())

但上述代码是格式化电话号码的最佳解决方案

除上述解决方案外,我还编写了一个适用于所有类型条件的代码:

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位添加“-”。
如果(len==4 | | len==8)

我对neo108的解决方案做了一些小改动,这样它就可以同时使用软键盘和硬键盘,例如,在我的代码中,edittext将按照规则自动在位置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());
                }
            }
        }

我实现了一个定制的
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);
            }
        }
    }
}

看看Thank@neo108,不过,我怎么能把它变成“3digits-4digits”由于代码的逻辑设置为4digits-4digits?请您发布您目前拥有的代码来格式化数字。您好,neo108,请参考上面的代码。谢谢!再次感谢Master@neo108nice!我能够实现此功能,因此如果您在邮政编码中键入6位数字,它将插入缺少的连字符。我正在尝试实现我的应用程序中没有此代码,但我的代码中出现了一个
无法解决符号“keyDel”
错误。我看不出该变量在上面的代码片段中声明的位置。有什么帮助吗?我解决了我的问题。你需要在
addTextChangedListener
方法中声明一个变量
int-keyDel
。现在它正在正常工作ugh如果您添加两个连字符并通过这两个连字符进行退格,则连字符无法正确添加回去。例如,我将
if(len==3)
更改为
if(len==2 | | len==6)
,在第2位和第6位之后添加连字符。如果只删除一个连字符,则可以使用连字符。如果同时删除两个连字符并重新开始键入,则新文本无法正确添加连字符。如果删除整个editText字段,连字符确实可以使用。非常感谢您添加破折号,但我知道ve还需要删除backspace…请帮我解决这个问题…但是这种方法是否只适用于xxx xxx xxxx的格式?@mike2013,该格式取决于目标设备上当前使用的系统区域设置。明白了。现在更有意义了。非常有希望且易于实现!此方法有两个问题:1)如果您在键盘上选择“-”,它将删除文本。当您使用空字符串时,它将崩溃2)如果您按住delete键,删除将被中断。我添加了一个实现,我使用了下面的一些代码,解决了我遇到的这些问题。
previousNumber
将抛出一个
NullPointerException
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());
                }
            }
        }
    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);
            }
        }
    }
}
   public static String removeNonnumeric(String text) {
        return text.replaceAll("[^\\d]", "");
    }
import android.text.Editable;
import android.text.Selection;
import android.text.TextWatcher;
import android.util.Log;
import android.widget.EditText;

/**
 * Auto-formats a number using -.
 * Ex. 303-333-3333
 * Ex. 1-303-333-3333
 * Doesn't allow deletion of just -
 */
public class PhoneNumberFormattingTextWatcher implements TextWatcher {
    private static final String TAG = "PhoneNumberTextWatcher";

    private final EditText editText;
    private String previousNumber;

    /**
     * Indicates the change was caused by ourselves.
     */
    private boolean mSelfChange = false;

    public PhoneNumberFormattingTextWatcher(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
        Log.i(TAG, "Previous String: " + previousNumber);

        //if self change ignore
        if (mSelfChange) {
            Log.i(TAG, "Ignoring self change");
            mSelfChange = false;
            return;
        }

        String phoneNumber = removeNonnumeric(editable.toString());
        int stringLength = phoneNumber.length();

        //empty case
        if(stringLength == 0) {
            mSelfChange = true;
            editText.setText("");
            return;
        }

        boolean startsWithOne = phoneNumber.charAt(0) == '1';
        int maxLength = 10 + (startsWithOne ? 1 : 0);

        //too large
        if(stringLength > maxLength) {
            Log.i(TAG, "String length is greater than max allowed, using previous string: " + previousNumber);
            mSelfChange = true;
            editText.setText(previousNumber);
            Editable etext = editText.getText();
            Selection.setSelection(etext, previousNumber.length());
            return;
        }

        phoneNumber = formatPhoneNumber(phoneNumber);

        if(previousNumber != null && phoneNumber.length() == previousNumber.length()) {
            //user deleting last character, and it is a -
            if(phoneNumber.endsWith("-")) {
                phoneNumber = phoneNumber.substring(0, phoneNumber.length()-2);
            }
        }

        mSelfChange = true;
        previousNumber = phoneNumber;
        editText.setText(phoneNumber);
        Editable etext = editText.getText();
        Selection.setSelection(etext, phoneNumber.length());
    }

    private String formatPhoneNumber(String phoneNumber) {
        int stringLength = phoneNumber.length();
        //check if starts with 1, if it does, dash index is increased by 1
        boolean startsWithOne = phoneNumber.charAt(0) == '1';

        //if the length of the string is 6, add another dash
        int lastHyphenIndex = 6 + (startsWithOne ? 1 : 0);
        if (stringLength >= lastHyphenIndex) {
            phoneNumber = phoneNumber.substring(0, lastHyphenIndex) + "-" + phoneNumber.substring(lastHyphenIndex, phoneNumber.length());
        }
        //if the length of the string is 3, add a dash
        int secondToLastHyphenIndex = 3 + (startsWithOne ? 1 : 0);
        if (stringLength >= secondToLastHyphenIndex) {
            phoneNumber = phoneNumber.substring(0, secondToLastHyphenIndex) + "-" + phoneNumber.substring(secondToLastHyphenIndex, phoneNumber.length());
        }
        //If the number starts with 1, add a dash after 1
        if (phoneNumber.startsWith("1")) {
            phoneNumber = phoneNumber.substring(0, 1) + "-" + phoneNumber.substring(1, phoneNumber.length());
        }

        return phoneNumber;
    }

    private static String removeNonnumeric(String text) {
        return text.replaceAll("[^\\d]", "");
    }
}