Live editing of users input

后端 未结 6 1119
半阙折子戏
半阙折子戏 2020-11-27 07:37

Is it possible to auto insert characters into an EditText as the user inputs data?

I.e. if the user is entering a long number such as <

相关标签:
6条回答
  • 2020-11-27 07:48

    For those still facing trouble with backspace and multiple hyphens -

    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());
            }
        }
    
    0 讨论(0)
  • 2020-11-27 07:52

    This is what I used

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

    Here you replace delimiter with what you want to separate digits.

    0 讨论(0)
  • 2020-11-27 08:02

    to solve this issue, i write a class "AutoAddTextWatcher" :

    1. Auto insert text into EditText.
    2. insert text into EditText at positions you are setted.
    3. delete text in EditText at positions you are setted, when text length bigger than 1.

    code snippet :

    mEditText_birthday.addTextChangedListener(new AutoAddTextWatcher(mEditText_birthday,
                "/",
                new TextWatcher() {},
                4, 6));
    

    AutoAddTextWatcher class

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

    complete demo source :
    https://github.com/henrychuangtw/AutoInsertEditText

    0 讨论(0)
  • 2020-11-27 08:03
    @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();
    }
    

    This will do as well, only this code will insert " - " after 3rd character.

    0 讨论(0)
  • 2020-11-27 08:10

    You can achieve this with on text changed

    in my case, i have to format input like this : xxx xxx-xxxx

    i done as given below:

    etMobileNumber.addTextChangedListener(object : TextWatcher {
            override fun afterTextChanged(s: Editable?) {
    
    
            }
    
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
            }
    
            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                if (etMobileNumber.text.length == 3 && count != 0) {
                    val text = etMobileNumber.getText().toString() + " "
                    etMobileNumber.setText(text)
                    etMobileNumber.setSelection(text.length)
                } else if (etMobileNumber.text.length == 7 && count != 0) {
                    val text = etMobileNumber.getText().toString() + "-"
                    etMobileNumber.setText(text)
                    etMobileNumber.setSelection(text.length)
                }
            }
        })
    

    and the result is very dynamic on the go while typing.

    input- 1234567890 result - 123 456-7890

    0 讨论(0)
  • 2020-11-27 08:13

    By tagging android, I think you are discussing about android editText, is so you can do it by listening the TextChangedListener,

    EDITED: for backspace

    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 讨论(0)
提交回复
热议问题