Here Custom class help in addition of Edittext in different box. Specify the entry count required in xml (entryCount) then at runtime that many boxes will be drawn.
This custom class helps to enter edittext in different boxes. This feature can be used in adding OTP or while entering pin. Easy to integrate just add CustomEntryEdittext class file in your package and then add CustomEntryEdittext view in your xml file.
Steps for integrating CustomEntryEdittext in your app.
1. Add CustomEntryEdittext class in your app.
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(); }
2. Add below in attrs.xml file i.e values/attrs.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="CustomEntryEdittext"> <attr name="entryCount" format="integer" /> </declare-styleable> </resources>
3. Add custom view in your layout
<com.custom.widget.CustomEntryEdittext android:id="@+id/custom_unique_edittext" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/txt_Subtitle" android:layout_centerInParent="true" app:editextCount="6"> </com.custom.widget.CustomEntryEdittext>
4. Use findviewbyID in fragment to get accees to the view
customUniqueEdittext.getEnteredText() can be used in fragment to get entered data
customUniqueEdittext.setOnFinishListerner(new CustomUniqueEdittext.onFinishListerner() { @Override public void onFinish(String enteredText) { //Api Call } });
OnFinish listerner is called once user completes entering all the letter in editttext.
HaPpY CoDiNg……
CustomEntryEdittext_editextCount is missing
LikeLike