从android中的edittext框中获取XXX-XXX-XXXX格式的电话号码

Posted

技术标签:

【中文标题】从android中的edittext框中获取XXX-XXX-XXXX格式的电话号码【英文标题】:getting phone number in XXX-XXX-XXXX format from edittext box in android 【发布时间】:2011-09-02 19:45:54 【问题描述】:

嗨 我正在编写一个 android,其中用户在编辑文本框中输入电话号码。 我希望数字采用 xxx-xxx-xxxx 的形式,这意味着在用户输入前 3 个字母和另一个 '-' 后,'-' 应该自动出现

我用EditText anum= (EditText)findViewById(R.id.altnum); anum.addTextChangedListener(new PhoneNumberFormattingTextWatcher());

但只有在输入所有数字后才会格式化。我希望在用户输入数据时进行更改,例如如果他按 123,hypen 应该会自动出现 请告诉我该怎么做。

谢谢你

此致

ChinniKrishna Kothapalli

【问题讨论】:

【参考方案1】:

最近,我也有同样的需求。我用 TextWatcher 试过这个。在这里分享,希望其他人以后可能需要。

public class PhoneNumberTextWatcher implements TextWatcher 

private static final String TAG = PhoneNumberTextWatcher.class
        .getSimpleName();
private EditText edTxt;
private boolean isDelete;

public PhoneNumberTextWatcher(EditText edTxtPhone) 
    this.edTxt = edTxtPhone;
    edTxt.setOnKeyListener(new OnKeyListener() 

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) 
            if (keyCode == KeyEvent.KEYCODE_DEL) 
                isDelete = true;
            
            return false;
        
    );


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


public void beforeTextChanged(CharSequence s, int start, int count,
        int after) 


public void afterTextChanged(Editable s) 

    if (isDelete) 
        isDelete = false;
        return;
    
    String val = s.toString();
    String a = "";
    String b = "";
    String c = "";
    if (val != null && val.length() > 0) 
        val = val.replace("-", "");
        if (val.length() >= 3) 
            a = val.substring(0, 3);
         else if (val.length() < 3) 
            a = val.substring(0, val.length());
        
        if (val.length() >= 6) 
            b = val.substring(3, 6);
            c = val.substring(6, val.length());
         else if (val.length() > 3 && val.length() < 6) 
            b = val.substring(3, val.length());
        
        StringBuffer stringBuffer = new StringBuffer();
        if (a != null && a.length() > 0) 
            stringBuffer.append(a);
            if (a.length() == 3) 
                stringBuffer.append("-");
            
        
        if (b != null && b.length() > 0) 
            stringBuffer.append(b);
            if (b.length() == 3) 
                stringBuffer.append("-");
            
        
        if (c != null && c.length() > 0) 
            stringBuffer.append(c);
        
        edTxt.removeTextChangedListener(this);
        edTxt.setText(stringBuffer.toString());
        edTxt.setSelection(edTxt.getText().toString().length());
        edTxt.addTextChangedListener(this);
     else 
        edTxt.removeTextChangedListener(this);
        edTxt.setText("");
        edTxt.addTextChangedListener(this);
    


 

谢谢

JRH

【讨论】:

解决方案不起作用!删除时卡在- @RobinHood,你能分享你试过的代码吗?同时,请看一下我尝试过的示例。 dropbox.com/s/72w2kojffb39y37/TestPhoneNumWatcher.zip @Robinhood,你试过我分享的样本了吗?请接受答案,如果这对你有用。提前致谢。 @jrhamza :您的 zip 文件代码也不起作用。它和你写的一样。它不能从 - 中删除。 1.是的,当删除字符“-”时卡住了 2.当我将光标放在中间的任何位置并删除字符删除和光标移动到最后的任何字符时。这也不应该发生。 【参考方案2】:

以下代码可以添加和删除场景,但逻辑要长一些:

public class PhoneNumberTextWatcher implements TextWatcher 

private static final String TAG = "PhoneNumberTextWatcher";
private EditText editText;

public PhoneNumberTextWatcher(EditText edTxtPhone) 
    this.editText = edTxtPhone;


public void onTextChanged(CharSequence s, int cursorPosition, int before,
                          int count) 

    if(before == 0 && count == 1)  //Entering values

        String val = s.toString();
        String a = "";
        String b = "";
        String c = "";
        if (val != null && val.length() > 0) 
            val = val.replace("-", "");
            if (val.length() >= 3) 
                a = val.substring(0, 3);
             else if (val.length() < 3) 
                a = val.substring(0, val.length());
            
            if (val.length() >= 6) 
                b = val.substring(3, 6);
                c = val.substring(6, val.length());
             else if (val.length() > 3 && val.length() < 6) 
                b = val.substring(3, val.length());
            
            StringBuffer stringBuffer = new StringBuffer();
            if (a != null && a.length() > 0) 
                stringBuffer.append(a);

            
            if (b != null && b.length() > 0) 
                stringBuffer.append("-");
                stringBuffer.append(b);

            
            if (c != null && c.length() > 0) 
                stringBuffer.append("-");
                stringBuffer.append(c);
            
            editText.removeTextChangedListener(this);
            editText.setText(stringBuffer.toString());
            if(cursorPosition == 3 || cursorPosition == 7)
                cursorPosition = cursorPosition+2;
            else
                cursorPosition = cursorPosition+1;
            
            if(cursorPosition <= editText.getText().toString().length()) 
                editText.setSelection(cursorPosition);
            else
                editText.setSelection(editText.getText().toString().length());
            
            editText.addTextChangedListener(this);
         else 
            editText.removeTextChangedListener(this);
            editText.setText("");
            editText.addTextChangedListener(this);
        

    

    if(before == 1 && count == 0)  //Deleting values

        String val = s.toString();
        String a = "";
        String b = "";
        String c = "";

        if (val != null && val.length() > 0) 
            val = val.replace("-", "");
            if(cursorPosition == 3)
                val = removeCharAt(val,cursorPosition-1,s.toString().length()-1);
            else if(cursorPosition == 7)
                val = removeCharAt(val,cursorPosition-2,s.toString().length()-2);
            
            if (val.length() >= 3) 
                a = val.substring(0, 3);
             else if (val.length() < 3) 
                a = val.substring(0, val.length());
            
            if (val.length() >= 6) 
                b = val.substring(3, 6);
                c = val.substring(6, val.length());
             else if (val.length() > 3 && val.length() < 6) 
                b = val.substring(3, val.length());
            
            StringBuffer stringBuffer = new StringBuffer();
            if (a != null && a.length() > 0) 
                stringBuffer.append(a);

            
            if (b != null && b.length() > 0) 
                stringBuffer.append("-");
                stringBuffer.append(b);

            
            if (c != null && c.length() > 0) 
                stringBuffer.append("-");
                stringBuffer.append(c);
            
            editText.removeTextChangedListener(this);
            editText.setText(stringBuffer.toString());
            if(cursorPosition == 3 || cursorPosition == 7)
                cursorPosition = cursorPosition-1;
            
            if(cursorPosition <= editText.getText().toString().length()) 
                editText.setSelection(cursorPosition);
            else
                editText.setSelection(editText.getText().toString().length());
            
            editText.addTextChangedListener(this);
         else 
            editText.removeTextChangedListener(this);
            editText.setText("");
            editText.addTextChangedListener(this);
        

    





public void beforeTextChanged(CharSequence s, int start, int count,
                              int after) 


public void afterTextChanged(Editable s) 




public static String removeCharAt(String s, int pos,int length) 

    String value = "";
    if(length > pos)
        value = s.substring(pos + 1);
    
    return s.substring(0, pos)+value ;


【讨论】:

【参考方案3】:

一种选择是实现您自己的InputFilter。

您可以在此处使用我的答案:press "." many times (validate ip address in EditText while typing) 和此处:How to set Edittext view allow only two numeric values and two decimal values like ##.##,以获取有关如何在键入时解析文本的示例。

如果您希望破折号自动出现,您需要将它们添加到您的过滤器方法的返回中

【讨论】:

以上是关于从android中的edittext框中获取XXX-XXX-XXXX格式的电话号码的主要内容,如果未能解决你的问题,请参考以下文章

Android设置EditText默认取消焦点

Android,从edittext中获取文本[重复]

如何从 Android 中每个动态创建的 EditText 获取数据?

从适配器类获取不同活动中的 EditText 值

使用kotlin从android中的BroadcastReceiver类访问edittext

如何从 EditText Android 获取值