Edit text for OTP with Each letter in separate positions

后端 未结 19 1061
别跟我提以往
别跟我提以往 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:51

    using DataBinding layout:

    public class EnterOTPActivity extends AppCompatActivity {
                private ActivityEnterOtpBinding binding;
                private Context mContext;
                private int currentEditIndex;
    
    
                @Override
                protected void onCreate(@Nullable Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    binding = DataBindingUtil.setContentView(this, R.layout.activity_enter_otp);
                    mContext = this;
    
                    binding.et1.addTextChangedListener(new MyTextChangeWatcher(1));
                    binding.et2.addTextChangedListener(new MyTextChangeWatcher(2));
                    binding.et3.addTextChangedListener(new MyTextChangeWatcher(3));
                    binding.et4.addTextChangedListener(new MyTextChangeWatcher(4));
                    binding.et5.addTextChangedListener(new MyTextChangeWatcher(5));
                    binding.et6.addTextChangedListener(new MyTextChangeWatcher(6));
    
                    binding.et1.setOnKeyListener(keyListener);
                    binding.et2.setOnKeyListener(keyListener);
                    binding.et3.setOnKeyListener(keyListener);
                    binding.et4.setOnKeyListener(keyListener);
                    binding.et5.setOnKeyListener(keyListener);
                    binding.et6.setOnKeyListener(keyListener);
    
    
                }
    
                private View.OnKeyListener keyListener = new View.OnKeyListener() {
    
                    @Override
                    public boolean onKey(View v, int keyCode, KeyEvent event) {
    
                        if ((((EditText) v).getText().toString() == null || ((EditText) v)
                                .getText().toString().isEmpty())
                                && keyCode == KeyEvent.KEYCODE_DEL
                                && event.getAction() == KeyEvent.ACTION_DOWN) {
    
                            if (currentEditIndex == 6)
                                currentEditIndex = 5;
                            if (currentEditIndex > 0) {
                                EditText editText = getEditTextFromIndex(currentEditIndex);
                               editText.setText("");
                                editText.requestFocusFromTouch();
                                currentEditIndex--;
                            }
                        }
    
                        return false;
                    }
                };
    
                class MyTextChangeWatcher implements TextWatcher {
                    private int index;
    
                    public MyTextChangeWatcher(int index) {
                        super();
                        this.index = index;
                    }
    
                    @Override
                    public void afterTextChanged(Editable s) {
                        if (s != null && s.length() == 1) {
                            if (index < 7) {
    
                                if (index < 6) {
                                    EditText editText = getEditTextFromIndex(index);
                                    editText.clearFocus();
                                    getEditTextFromIndex(index + 1).requestFocusFromTouch();
                                }
                                currentEditIndex = index;
                            } else {
    
                            }
                        } else {
                        }
                    }
    
                    @Override
                    public void beforeTextChanged(CharSequence s, int start, int count,
                                                  int after) {
                    }
    
                    @Override
                    public void onTextChanged(CharSequence s, int start, int before,
                                              int count) {
                    }
                }
    
                private EditText getEditTextFromIndex(int index) {
                    switch (index) {
                        case 1:
                            return binding.et1;
                        case 2:
                            return binding.et2;
                        case 3:
                            return binding.et3;
                        case 4:
                            return binding.et4;
                        case 5:
                            return binding.et5;
                        case 6:
                            return binding.et6;
    
                        default:
                            break;
                    }
                    return null;
                }
            }
    

提交回复
热议问题