Edit text for OTP with Each letter in separate positions

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

    using DataBinding :

    class EnterOTPDialogFragment extends Fragment {
        FragmentEnterOtpdialogBinding binding;
        GenericTextWatcher watcher1;
        GenericTextWatcher watcher2;
        GenericTextWatcher watcher3;
        GenericTextWatcher watcher4;
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
    
            binding = DataBindingUtil.inflate(inflater, R.layout.fragment_enter_otpdialog, container, false);
    
            watcher1 = new GenericTextWatcher(binding.optDigit1);
            watcher2 = new GenericTextWatcher(binding.optDigit2);
            watcher3 = new GenericTextWatcher(binding.optDigit3);
            watcher4 = new GenericTextWatcher(binding.optDigit4);
            binding.optDigit1.addTextChangedListener(watcher1);
            binding.optDigit1.setOnKeyListener(watcher1);
            binding.optDigit2.addTextChangedListener(watcher2);
            binding.optDigit2.setOnKeyListener(watcher2);
            binding.optDigit3.addTextChangedListener(watcher3);
            binding.optDigit3.setOnKeyListener(watcher3);
            binding.optDigit4.addTextChangedListener(watcher4);
            binding.optDigit4.setOnKeyListener(watcher4);
            return binding.getRoot();
        }
    
        public class GenericTextWatcher implements TextWatcher, View.OnKeyListener {
            private View view;
            String previousText = "";
    
            private GenericTextWatcher(View view) {
                this.view = view;
            }
    
            @Override
            public void afterTextChanged(Editable editable) {
                // TODO Auto-generated method stub
                String text = editable.toString();
                switch (view.getId()) {
    
                    case R.id.optDigit1:
                        if (text.length() == 1) {
                            if (previousText.length() > 0) {
                                binding.optDigit1.removeTextChangedListener(watcher1);
                                binding.optDigit1.setText(previousText);
                                binding.optDigit1.addTextChangedListener(watcher1);
    
                                binding.optDigit2.removeTextChangedListener(watcher2);
                                binding.optDigit2.setText(text);
                                binding.optDigit2.addTextChangedListener(watcher2);
                            }
                            binding.optDigit2.requestFocus();
                        }
                        break;
                    case R.id.optDigit2:
                        if (text.length() == 1) {
                            if (previousText.length() > 0) {
                                binding.optDigit2.removeTextChangedListener(watcher2);
                                binding.optDigit2.setText(previousText);
                                binding.optDigit2.addTextChangedListener(watcher2);
    
                                binding.optDigit3.removeTextChangedListener(watcher3);
                                binding.optDigit3.setText(text);
                                binding.optDigit3.addTextChangedListener(watcher3);
    
                            }
                            binding.optDigit3.requestFocus();
    
                        } else if (text.length() == 0)
                            binding.optDigit1.requestFocus();
                        break;
                    case R.id.optDigit3:
                        if (text.length() == 1) {
                            if (previousText.length() > 0) {
                                binding.optDigit3.removeTextChangedListener(watcher3);
                                binding.optDigit3.setText(previousText);
                                binding.optDigit3.addTextChangedListener(watcher3);
    
                                binding.optDigit4.removeTextChangedListener(watcher4);
                                binding.optDigit4.setText(text);
                                binding.optDigit4.addTextChangedListener(watcher4);
                            }
                            binding.optDigit4.requestFocus();
                        } else if (text.length() == 0)
                            binding.optDigit2.requestFocus();
                        break;
                    case R.id.optDigit4:
                        if (text.length() == 0) {
    
                            binding.optDigit3.requestFocus();
                        } else {
                            try {
                                final InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                                imm.hideSoftInputFromWindow(getView().getWindowToken(), 0);
                                Log.e(TAG, "afterTextChanged: hide keyboard");
                            } catch (Exception e) {
                                Log.e(TAG, "afterTextChanged: " + e.toString());
                            }
                        }
    
    
                        break;
                }
            }
    
            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
                // TODO Auto-generated method stub
                Log.d(TAG, "beforeTextChanged: " + arg0);
                if (arg0.length() > 0) {
                    previousText = arg0.toString();
                }
            }
    
            @Override
            public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
                // TODO Auto-generated method stub
            }
    
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                previousText = "";
                Log.d(TAG, "onKey: keyCode = " + keyCode + ", event = " + event.toString());
                if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KEYCODE_DEL) {
                    switch (view.getId()) {
                        case R.id.optDigit2:
                            if (binding.optDigit2.getText().toString().trim().length() == 0)
                                binding.optDigit1.requestFocus();
                            break;
                        case R.id.optDigit3:
                            if (binding.optDigit3.getText().toString().trim().length() == 0)
                                binding.optDigit2.requestFocus();
                            break;
                        case R.id.optDigit4:
                            if (binding.optDigit4.getText().toString().trim().length() == 0)
                                binding.optDigit3.requestFocus();
                            else if (binding.optDigit4.getText().toString().trim().length() == 1)
                                try {
    
                                    ((BaseActivity) getActivity()).hideSoftKeyboard();
                                } catch (Exception e) {
                                    Log.e(TAG, "afterTextChanged: " + e.toString());
                                }
                            break;
                    }
    
                }
                return false;
            }
        }
    }
    

提交回复
热议问题