【问题标题】:I want to design an OTP Screen with EditText我想用 EditText 设计一个 OTP 屏幕
【发布时间】:2018-07-29 11:14:29
【问题描述】:

我计划设计一个带有 6 个 EditTexts 的 OTP 屏幕,所以我在所有 editTexts 中实现了 TextWatcher。所以它会前进到每个editText,我还实现了基于editText长度后退的逻辑,但是如果用户输入错误的otp并且如果用户在点击键盘上的delete键时继续那个特定的editText,它将转到以前的editText但是它不应该回到以前的editText,而是应该保留在同一个editText中。

private void setEventsForEditText() {
   editFirstOTPDigit.addTextChangedListener(new TextWatcher() {
       @Override
       public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
       }

       @Override
       public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
           if (charSequence.length() == 1) {
               editSecondOTPDigit.requestFocus();
           }
       }

       @Override
       public void afterTextChanged(Editable editable) {
       }
   });

   editSecondOTPDigit.addTextChangedListener(new TextWatcher() {
       @Override
       public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

       }

       @Override
       public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
           if (charSequence.length() == 1) {
               editThirdOTPDigit.requestFocus();
           } else {
               editSecondOTPDigit.requestFocus();
           }

       }

       @Override
       public void afterTextChanged(Editable editable) {

       }
   });

   editThirdOTPDigit.addTextChangedListener(new TextWatcher() {
       @Override
       public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

       }

       @Override
       public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
           if (charSequence.length() == 1) {
               editFourthOTPDigit.requestFocus();
           } else {
               editSecondOTPDigit.requestFocus();
           }
       }

       @Override
       public void afterTextChanged(Editable editable) {

       }
   });

   editFourthOTPDigit.addTextChangedListener(new TextWatcher() {
       @Override
       public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

       }

       @Override
       public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
           if (charSequence.length() == 1) {
               editFifthOTPDigit.requestFocus();
           } else {
               editThirdOTPDigit.requestFocus();
           }

       }

       @Override
       public void afterTextChanged(Editable editable) {

       }
   });

   editFifthOTPDigit.addTextChangedListener(new TextWatcher() {
       @Override
       public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

       }

       @Override
       public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
           if (charSequence.length() == 1) {
               editSixthOTPDigit.requestFocus();
           } else {
               editFourthOTPDigit.requestFocus();
           }
       }

       @Override
       public void afterTextChanged(Editable editable) {

       }
   });

   editSixthOTPDigit.addTextChangedListener(new TextWatcher() {
       @Override
       public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

       }

       @Override
       public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
           if (charSequence.length() == 1) {
               buttonVerifyOTP.setVisibility(View.VISIBLE);
               hideKeyboard();
           } else {
               editFifthOTPDigit.requestFocus();
           }
       }

       @Override
       public void afterTextChanged(Editable editable) {

       }
   });

【问题讨论】:

    标签: android android-edittext one-time-password


    【解决方案1】:

    尚未对此进行测试,但您可以尝试以下操作:

    创建一些标志说

             private boolean isWrondOtp;
    

    在 OTP 验证后将此设置为 true

    你的文本观察器看起来像这样

    editSecondOTPDigit.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
    
            }
    
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                if (charSequence.length() == 1) {
                    editThirdOTPDigit.requestFocus();
                } else {
                    if (!isWrondOtp)
                        editSecondOTPDigit.requestFocus();
                }
    
            }
    
            @Override
            public void afterTextChanged(Editable editable) {
    
            }
        });
    

    【讨论】:

      猜你喜欢
      • 2018-12-30
      • 2023-02-26
      • 2019-11-11
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 1970-01-01
      • 2020-02-23
      • 2021-04-21
      相关资源
      最近更新 更多