我正在尝试在用户输入时格式化编辑文本的值。我想要的是用户应该能够键入,并在给出输入时查看更改。
我的要求是,在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中执行操作,因为在用户键入时会调用此方法。我的格式化工作正常,但如果用户将光标指向其间的任何数字并删除数字,则格式化会中断,并在末尾附加另一个连字符。所以基本上,我想优雅地处理软键盘上的删除键(我知道没有给出任何事件),然后如果用户键入另一个数字,它应该放在光标位置,而不是在最后。
答案 0 :(得分:3)
您可以使用PatternedTextWatcher实现这一目标。
简单的一行解决方案
1)将其添加到gradle
文件编译'com.szagurskii:patternedtextwatcher:0.5.0'
2)然后你的EditText
将会是这样的
mEditText = findViewById(R.id.mEditText);
mEditText.addTextChangedListener(new PatternedTextWatcher("###-####-#######-#"));
最终结果
答案 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,连字符也将被删除。我认为这样做会很好。