在编辑文字上输入时在数字之间插入“ – ”

我试图格式化编辑文本的值,因为用户键入。 我想要的是用户应该能够输入,并看到输入的变化。

我的要求是,在3位数types之后,应该添加一个连字符,第一个连字符后面会输入另外4位数字,然后再附加一个连字符,然后是7位数字,然后是1之后。所以基本上格式化应该看起来像这样:123-1234-1234567-1。

现在,问题是我可以用标准的文本观察器来实现这个function,但是在使用退格键或者在软输入键盘上删除的时候,这个function是不正常的。

我的代码如下:

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:

    

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

你可以通过PatternedTextWatcher实现。

简单的一线解决方案

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

2)然后你的EditText看起来像这样

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

最后结果

像魅力一样没有任何缺陷 在这里输入图像说明

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

我会把代码放在afterTextChanged。 然后,我只看整个字符串,删除任何非数字部分,并根据需要插入连字符以正确的间隔。 我认为这会处理好事情。

所以你需要一种方法把“25274 * 8f3h983t3”变成“252-7483-9833”。 这样做的效果是,用户输入的非数字字符将被直接删除,并且可以在字符串中的任何位置添加数字,连字符会自动重新定位。

例如)这个人输入“12345678”

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