2010-11-13 69 views
6

的实时编辑是否有可能自动插入字符到EditText作为用户输入数据用户输入

I.e.如果用户输入一个很长的数字,如123456789012,是否可以在编辑文本框中输入该数字,但每隔4个字符输入一个破折号?

所以当你输入上面的数字,你会看到它在EditText箱被输入,但会是这样的:1234-5678-9012。

目前,我有一个应用程序,你可以输入一个长的号码,然后按下一个按钮,并将其插入破折号你的,但我很好奇,如果您键入它可以做?

非常感谢您的帮助。

+1

什么语言?什么平台?总的来说,这是可能的,但细节取决于语言和平台。 – Oded 2010-11-13 11:19:46

+0

在哪些技术?例如。在一个网页,一个iPhone应用程序等。 – 2010-11-13 11:19:52

回答

11

通过标记机器人,我认为你正在讨论关于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) { 
      } 


     }); 
+0

太棒了。非常感谢您的答复。 – Entropy1024 2010-11-13 13:31:14

+1

也处理删除操作 - 给出的示例可能会导致键入4个字符后退格不可能(因为删除短划线后会立即添加另一个字符)。 – Nick 2010-11-13 14:49:31

+0

@Nick,我已经编辑它为退格,所以它不是不可能的 – 2010-11-15 11:01:16

0
@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(); 
} 

这会照那么只有这个代码会在第三个字符后面插入" - "

0

这是我用来

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; 
    } 
} 

在这里你要分开位数的数据进行替换分隔符。

0

对于退格键和多连字符那些仍然面临麻烦 -

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()); 
     } 
    } 
6

来解决这个问题,我写一个类“AutoAddTextWatcher”:

1.自动插入文本的EditText。
2.在您设置的位置插入文本到EditText中。
3.在你设置好的位置上的EditText删除文本,当文本长度大于1

enter image description here

代码片段:

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

+0

哇!你是个天才!非常感谢你这么做......我已经尝试了很多解决方案,但没有任何正确的方法。我需要得到它的格式如下:12-345-67。当您删除并尝试重新输入时,其他任何解决方案都会发生奇怪的事情。您的解决方案非常有效!有一件事需要注意,为了让你的类正常工作,你需要将XML文件中的输入类型设置为android:inputType =“phone”''我最初使用'android:inputType =“number”'尝试,并且它没有没有工作。我检查了你的github页面,看到你使用了'phone',现在可以工作。做得好! – 2016-10-26 01:11:53

+0

这里是我的实现:'EnterUserID.addTextChangedListener(new AutoAddTextWatcher(enterUserID, “ - ”, 2,5));' – 2016-10-26 01:20:24

+0

@KevinBright感谢您的鼓励和建议,我会尝试一下。 – HenryChuang 2016-10-26 01:31:48