插入" - "在编辑文本上键入数字之间

时间:2018-02-05 07:05:56

标签: android android-layout android-edittext

我正在尝试在用户输入时格式化编辑文本的值。我想要的是用户应该能够键入,并在给出输入时查看更改。

我的要求是,在3个数字类型之后,应该附加一个连字符,在第一个连字符后,将输入另外4个数字,然后添加另一个连字符,然后在七个数字之后,然后在1.之后,格式应如下所示:123-1234-1234567-1。

现在,问题是我可以使用标准文本观察器来实现这一点,但是当使用退格键或在软输入键盘上删除时,这会出现故障。

我的代码如下:

mEditText = (TextInputEditText) findViewById(R.id.myEditText);
mEditText.addTextChangedListener(mTextWatcher);

我的文字观察者:

private TextWatcher mTextWatcher= new TextWatcher() {

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

            String str = charSequence.toString();  
            mEditText.setOnKeyListener(new View.OnKeyListener() {
                @Override
                public boolean onKey(View view, int keyCode, KeyEvent keyEvent) {

                    if(keyCode != KeyEvent.KEYCODE_DEL && mEditText.getText().toString().length() != 0){
                        if(mEditText.getText().length()==4 ||mEditText.getText().length()==9 ||mEditText.getText().length()==17 ||mEditText.getText().length()==19)
                        {
                            String tempString;
                            char[] stringArray;
                            tempString=mEditText.getText().toString()+"-";
                            char c=tempString.charAt(tempString.length()-2);

                            if(c!='-')
                            {
                                stringArray = tempString.toCharArray();
                                stringArray[tempString.length()-2]=stringArray[tempString.length()-1];
                                stringArray[tempString.length()-1]=c;                                     
                                tempString=new String(stringArray);
                                mEditText.setText(tempString);
                                mEditText.setSelection(tempString.length());
                                tempString=null;
                            }

                        }
                    }
                    return false;
                }
            });        
        }   
        @Override
        public void afterTextChanged(Editable editable) {

            if (editable.length() == 3) {
                editable.append('-');
            }
        }
    };

然后,我的xml:

<android.support.design.widget.TextInputLayout
        android:id="@+id/phone_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp">

        <android.support.design.widget.TextInputEditText
            android:id="@+id/myEditText"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:maxLength="18"
            android:inputType="number"/>
    </android.support.design.widget.TextInputLayout>

我希望在onTextChanged中执行操作,因为在用户键入时会调用此方法。我的格式化工作正常,但如果用户将光标指向其间的任何数字并删除数字,则格式化会中断,并在末尾附加另一个连字符。所以基本上,我想优雅地处理软键盘上的删除键(我知道没有给出任何事件),然后如果用户键入另一个数字,它应该放在光标位置,而不是在最后。

3 个答案:

答案 0 :(得分:3)

您可以使用PatternedTextWatcher实现这一目标。

简单的一行解决方案

1)将其添加到gradle文件编译'com.szagurskii:patternedtextwatcher:0.5.0'

2)然后你的EditText将会是这样的

mEditText = findViewById(R.id.mEditText);
mEditText.addTextChangedListener(new PatternedTextWatcher("###-####-#######-#"));

最终结果

像没有任何瑕疵的魅力 enter image description here

答案 1 :(得分:0)

试试这个库:https://github.com/RedMadRobot/input-mask-android(他们已经迁移到Kotlin,但也有Java版本。)

答案 2 :(得分:0)

我会将代码放在afterTextChanged中。然后我会查看整个字符串,删除任何非数字部分,并根据需要以正确的间隔插入连字符。我认为这样做会很好。

所以你需要一种方法将类似“25274 * 8f3h983t3”的东西变成“252-7483-9833”。这样做的结果是用户类型的非数字字符将被立即删除,并且它们可以在字符串中的任何位置添加数字,连字符会自动重新定位。

例如)此人输入“12345678”

在前3后,什么都不会发生。一旦他们输入了4,你的代码就会在它后面添加一个连字符(123-4)。一旦他们键入8,将添加另一个连字符(123-4567-8)。如果它们退回8,连字符也将被删除。我认为这样做会很好。