的实时编辑是否有可能自动插入字符到EditText
作为用户输入数据?用户输入
I.e.如果用户输入一个很长的数字,如123456789012
,是否可以在编辑文本框中输入该数字,但每隔4个字符输入一个破折号?
所以当你输入上面的数字,你会看到它在EditText
箱被输入,但会是这样的:1234-5678-9012。
目前,我有一个应用程序,你可以输入一个长的号码,然后按下一个按钮,并将其插入破折号你的,但我很好奇,如果您键入它可以做?
非常感谢您的帮助。
的实时编辑是否有可能自动插入字符到EditText
作为用户输入数据?用户输入
I.e.如果用户输入一个很长的数字,如123456789012
,是否可以在编辑文本框中输入该数字,但每隔4个字符输入一个破折号?
所以当你输入上面的数字,你会看到它在EditText
箱被输入,但会是这样的:1234-5678-9012。
目前,我有一个应用程序,你可以输入一个长的号码,然后按下一个按钮,并将其插入破折号你的,但我很好奇,如果您键入它可以做?
非常感谢您的帮助。
通过标记机器人,我认为你正在讨论关于Android EDITTEXT,是这样你就可以通过监听TextChangedListener做到这一点,
编辑:退格键
editText.addTextChangedListener(new TextWatcher() {
int len=0;
@Override
public void afterTextChanged(Editable s) {
String str = editText.getText().toString();
if(str.length()==4&& len <str.length()){//len check for backspace
editText.append("-");
}
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
String str = editText.getText().toString();
len = str.length();
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
});
太棒了。非常感谢您的答复。 – Entropy1024 2010-11-13 13:31:14
也处理删除操作 - 给出的示例可能会导致键入4个字符后退格不可能(因为删除短划线后会立即添加另一个字符)。 – Nick 2010-11-13 14:49:31
@Nick,我已经编辑它为退格,所以它不是不可能的 – 2010-11-15 11:01:16
@Override
public void afterTextChanged(Editable s) {
if(s.length() == 3 && len < s.length()){
s.append(" - ");
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
len = s.length();
}
这会照那么只有这个代码会在第三个字符后面插入" - "
。
这是我用来
private boolean mInEdit;
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (!mInEdit) {
mInEdit = true;
String delimiter = " - ";
//Remove chars from your delimiter first
String digits = s.toString().replaceAll("[- ]", "")
.replaceAll("\\d{4}", "$0" + delimiter);
//Handle deletion
int dLength = delimiter.length();
if (before > count && digits.endsWith(delimiter.charAt(dLength - 1)) {
digits = digits.substring(0, digits.length() - dLength);
}
mCardNumber.setText(digits);
mCardNumber.setSelection(mCardNumber.length());
mInEdit = false;
}
}
在这里你要分开位数的数据进行替换分隔符。
对于退格键和多连字符那些仍然面临麻烦 -
new TextWatcher()
{
boolean hyphenExists;
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
if (s.length() >= 6 && s.charAt(5) == '-') {
hyphenExists = true;
} else {
hyphenExists = false;
}
Log.d("TAG", "beforeTextChanged " + s.toString());
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
Log.d("TAG", "onTextChanged " + s.toString());
}
@Override
public void afterTextChanged(Editable s) {
if (s.length() == 5) {
if (!hyphenExists)
s.append('-');
}
Log.d("TAG", "afterTextChanged " + s.toString());
}
}
来解决这个问题,我写一个类“AutoAddTextWatcher”:
1.自动插入文本的EditText。
2.在您设置的位置插入文本到EditText中。
3.在你设置好的位置上的EditText删除文本,当文本长度大于1
代码片段:
mEditText_birthday.addTextChangedListener(new AutoAddTextWatcher(mEditText_birthday,
"/",
new TextWatcher() {},
4, 6));
AutoAddTextWatcher类
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
/**
* Created by henry.chuang on 2016/5/12.
*/
public class AutoAddTextWatcher implements TextWatcher {
private CharSequence mBeforeTextChanged;
private TextWatcher mTextWatcher;
private int[] mArray_pos;
private EditText mEditText;
private String mAppentText;
public AutoAddTextWatcher(EditText editText, String appendText, int... position){
this.mEditText = editText;
this.mAppentText = appendText;
this.mArray_pos = position.clone();
}
public AutoAddTextWatcher(EditText editText, String appendText, TextWatcher textWatcher, int... position){
this(editText, appendText, position);
this.mTextWatcher = textWatcher;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
mBeforeTextChanged = s.toString();
if(mTextWatcher != null)
mTextWatcher.beforeTextChanged(s, start, count, after);
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
for (int i = 0; i < mArray_pos.length; i++) {
if(((mBeforeTextChanged.length() - mAppentText.length() * i) == (mArray_pos[i] - 1) &&
(s.length() - mAppentText.length() * i) == mArray_pos[i])){
mEditText.append(mAppentText);
break;
}
if(((mBeforeTextChanged.length() - mAppentText.length() * i) == mArray_pos[i] &&
(s.length() - mAppentText.length() * i) == (mArray_pos[i] + 1))){
int idx_start = mArray_pos[i] + mAppentText.length() * i;
int idx_end = Math.min(idx_start + mAppentText.length(), s.length());
String sub = mEditText.getText().toString().substring(idx_start, idx_end);
if(!sub.equals(mAppentText)){
mEditText.getText().insert(s.length() - 1, mAppentText);
}
break;
}
if(mAppentText.length() > 1 &&
(mBeforeTextChanged.length() - mAppentText.length() * i) == (mArray_pos[i] + mAppentText.length()) &&
(s.length() - mAppentText.length() * i) == (mArray_pos[i] + mAppentText.length() - 1)){
int idx_start = mArray_pos[i] + mAppentText.length() * i;
int idx_end = Math.min(idx_start + mAppentText.length(), s.length());
mEditText.getText().delete(idx_start, idx_end);
break;
}
}
if(mTextWatcher != null)
mTextWatcher.onTextChanged(s, start, before, count);
}
@Override
public void afterTextChanged(Editable s) {
if(mTextWatcher != null)
mTextWatcher.afterTextChanged(s);
}
}
完整的演示来源:
https://github.com/henrychuangtw/AutoInsertEditText
哇!你是个天才!非常感谢你这么做......我已经尝试了很多解决方案,但没有任何正确的方法。我需要得到它的格式如下:12-345-67。当您删除并尝试重新输入时,其他任何解决方案都会发生奇怪的事情。您的解决方案非常有效!有一件事需要注意,为了让你的类正常工作,你需要将XML文件中的输入类型设置为android:inputType =“phone”''我最初使用'android:inputType =“number”'尝试,并且它没有没有工作。我检查了你的github页面,看到你使用了'phone',现在可以工作。做得好! – 2016-10-26 01:11:53
这里是我的实现:'EnterUserID.addTextChangedListener(new AutoAddTextWatcher(enterUserID, “ - ”, 2,5));' – 2016-10-26 01:20:24
@KevinBright感谢您的鼓励和建议,我会尝试一下。 – HenryChuang 2016-10-26 01:31:48
什么语言?什么平台?总的来说,这是可能的,但细节取决于语言和平台。 – Oded 2010-11-13 11:19:46
在哪些技术?例如。在一个网页,一个iPhone应用程序等。 – 2010-11-13 11:19:52