Edit text for OTP with Each letter in separate positions

后端 未结 19 1035
别跟我提以往
别跟我提以往 2020-12-13 00:25

I\'m working on a application which asks for OTP when user want to reset his password for which I need a text like the one in attached Image... What I thought to proceed wi

19条回答
  •  悲哀的现实
    2020-12-13 00:56

    You can make a custom Editext and add it in your xml file, find below a custom class

    public class CustomEntryEdittext extends LinearLayout { 
    
        public int entryCount = 0; //count of boxes to be created
        private int currentIndex = 0;
        private static int EDITTEXT_MAX_LENGTH = 1; //character size of each editext
        private static int EDITTEXT_WIDTH = 40;
        private static int EDITTEXT_TEXTSIZE = 20; //textsize
        private boolean disableTextWatcher = false, backKeySet = false;
        private TextWatcher txtWatcher;
        private onFinishListerner mListerner;
    
    
        public CustomEntryEdittext(Context context) {
            super(context, null);
        }
    
        public CustomEntryEdittext(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        public CustomEntryEdittext(Context context, AttributeSet attrs, int defStyle) {
            this(context, attrs, defStyle, 0);
        }
    
        public CustomEntryEdittext(Context context, AttributeSet attrs, int defStyle, int defStyleRes) {
            super(context, attrs);
            init(context, attrs);
        }
    
        public void setOnFinishListerner(onFinishListerner listerner) {
            this.mListerner = listerner;
        }
    
        public interface onFinishListerner {
            void onFinish(String enteredText);
        }
    
    
        private void init(Context context, AttributeSet attrs) {
    
            TypedArray a = context.obtainStyledAttributes(attrs,
                    R.styleable.CustomEntryEdittext, 0, 0);
    
    
            entryCount = a.getInteger(R.styleable.CustomEntryEdittext_editextCount, 0);
    
            a.recycle();
    
            setOrientation(LinearLayout.HORIZONTAL);
            setGravity(Gravity.CENTER_VERTICAL);
    
            for (int i = 0; i < entryCount; i++) {
    
                //creates edittext based on the no. of count
                addView(initialiseAndAddChildInLayout(i, context), i);
            }
    
        }
    
        //method focuses of previous editext
        private void getPreviousEditext(int index) {
            if (index > 0) {
                EditText edtxt = (EditText) getChildAt(index - 1);
                disableTextWatcher = true;
    
                 edtxt.setText("");
                edtxt.requestFocus();
                disableTextWatcher = false;
    
            }
        }
    
        //method focuses of previous editext
        private void getPreviousEditextFocus(int index) {
            if (index > 0) {
                EditText edtxt = (EditText) getChildAt(index - 1);
                disableTextWatcher = true;
                edtxt.requestFocus();
                disableTextWatcher = false;
            }
        }
    
    
        //method to focus on next edittext
        private void getNextEditext(int index) {
            if (index < entryCount - 1) {
                EditText edtxt = (EditText) getChildAt(index + 1);
                edtxt.requestFocus();
            }
        }
    
    
        private View initialiseAndAddChildInLayout(int index, Context context) {
            final EditText editext = new EditText(context);
            editext.setMaxWidth(1);
            editext.setTag(index);
            editext.setGravity(Gravity.CENTER);
            editext.setTextSize(EDITTEXT_TEXTSIZE);
            editext.setInputType(EditorInfo.TYPE_CLASS_NUMBER);
            editext.setFilters(new InputFilter[]{new InputFilter.LengthFilter(EDITTEXT_MAX_LENGTH)});
            LayoutParams param = new LayoutParams(0, LayoutParams.WRAP_CONTENT, 1);
            editext.setLayoutParams(param);
            editext.addTextChangedListener(txtWatcher = new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    
    
                }
    
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    currentIndex = Integer.parseInt(editext.getTag().toString());
    
    
                    if (editext.getText().toString().length() == 1 && !disableTextWatcher) {
                        getNextEditext(currentIndex);
                    } else if (editext.getText().toString().length() == 0 && !disableTextWatcher) {// && !isFirstTimeGetFocused && !backKeySet) {
                        getPreviousEditext(currentIndex);
                    }
    
                }
    
                @Override
                public void afterTextChanged(Editable s) {
    
    
                }
            });
            editext.setOnKeyListener(new OnKeyListener() {
                @Override
                public boolean onKey(View v, int keyCode, KeyEvent event) {
                    if (keyCode == KeyEvent.KEYCODE_DEL) {
                        currentIndex = Integer.parseInt(editext.getTag().toString());
                        if (editext.getText().toString().length() == 0 && !disableTextWatcher) {
                            getPreviousEditextFocus(currentIndex);
                        } else {
                            disableTextWatcher = true;
                            editext.setText("");
                            disableTextWatcher = false;
                        }
                        backKeySet = true;
                    }
    
                    return true;
                }
    
    
            });
            editext.setOnEditorActionListener(new TextView.OnEditorActionListener() {
                public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                    if ((event != null && (event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) || (actionId == EditorInfo.IME_ACTION_DONE)) {
                        if(currentIndex==entryCount-1 && getEnteredText().length()==entryCount)
                        {
                            mListerner.onFinish(getEnteredText());
                        }
                    }
                    return false;
                }
            });
    
            return editext;
        }
    
    
        public String getEnteredText() {
            String strEnteredValue = "";
            for (int i = 0; i < getChildCount(); i++) {
                EditText editText = (EditText) getChildAt(i);
                if (editText.getText() != null && editText.getText().toString().length() > 0)
                    strEnteredValue = strEnteredValue + editText.getText().toString();
    
            }
            return strEnteredValue;
        }
    
        public void clearCustomEntryEdittext() {
            for (int i = 0; i < getChildCount(); i++) {
                EditText editText = (EditText) getChildAt(i);
                editText.setText("");
            }
            EditText editText = (EditText) getChildAt(0);
            editText.requestFocus();
        }
    }
    
    //and add it in your xml file
    
    
    
    

    For reference check below link

    https://madoverandroid.wordpress.com/2017/07/11/edittext-with-separate-box-for-each-letter-customentryedittext/

提交回复
热议问题