You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用TextWatcher校验文本有效性及实现移动银行MPIN验证跳转

我来帮你解决这两个问题,咱们一步步来:

1. 如何使用TextWatcher检查给定文本是否有效?

TextWatcher是Android中监听文本输入变化的核心工具,你主要可以借助它的afterTextChanged或onTextChanged方法来完成有效性校验,核心思路如下:

  • 在文本变化完成后(afterTextChanged),获取当前输入的完整内容
  • 根据你的业务规则(比如是否为纯数字、长度是否达标、是否包含非法字符等)做校验
  • 根据校验结果给出反馈(比如弹出提示、设置输入框错误样式等)

举个简单的纯数字校验示例:

EditText inputEt = findViewById(R.id.input_edit_text);
inputEt.addTextChangedListener(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) {
        // 文本实时变化时的回调,适合做实时反馈
    }

    @Override
    public void afterTextChanged(Editable s) {
        String inputContent = s.toString();
        // 校验是否为纯数字
        if (!inputContent.matches("[0-9]+")) {
            inputEt.setError("请输入纯数字内容");
        } else {
            inputEt.setError(null); // 清除错误提示
        }
    }
});
2. 移动银行MPIN功能的验证逻辑实现

你的现有代码已经完成了输入框焦点自动切换的功能,验证逻辑最合适的位置就是最后一个EditText(t6)的afterTextChanged方法中——当用户输入完第6位PIN时,自动触发校验流程。具体实现步骤和修改后的代码如下:

核心实现步骤

  1. 拼接完整PIN码:当t6输入完成(文本长度为1)时,将t1到t6的内容拼接成完整的6位字符串
  2. 读取存储的PIN:从SharedPreference中取出用户预先保存的正确PIN码
  3. 对比校验:
    • 若输入PIN与存储的一致:自动跳转到下一页面
    • 若不一致:弹出错误提示框,清空所有输入框并将焦点放回第一个输入框
  4. 处理删除操作:当t6的内容被清空时,仅处理焦点回退,不触发校验

修改后的完整代码

我已经帮你在现有代码基础上加入了完整的校验逻辑:

public class AboutUsActivity extends AppCompatActivity {
    EditText t1,t2,t3,t4,t5,t6;
    // 定义SharedPreference存储PIN的键名
    private static final String SP_SAVED_PIN_KEY = "bank_mpin";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_about_us);
        t1=(EditText) findViewById(R.id.first);
        t2=(EditText) findViewById(R.id.second);
        t3=(EditText) findViewById(R.id.third);
        t4=(EditText) findViewById(R.id.fourth);
        t5=(EditText) findViewById(R.id.fifth);
        t6=(EditText) findViewById(R.id.sixth);

        t1.addTextChangedListener(new GenericTextWatcher(t1));
        t2.addTextChangedListener(new GenericTextWatcher(t2));
        t3.addTextChangedListener(new GenericTextWatcher(t3));
        t4.addTextChangedListener(new GenericTextWatcher(t4));
        t5.addTextChangedListener(new GenericTextWatcher(t5));
        t6.addTextChangedListener(new GenericTextWatcher(t6));
    }

    public class GenericTextWatcher implements TextWatcher {
        private View view;
        private GenericTextWatcher(View view) {
            this.view = view;
        }

        @Override
        public void afterTextChanged(Editable editable) {
            String text = editable.toString();
            switch(view.getId()) {
                case R.id.first:
                    if(text.length()==1) t2.requestFocus();
                    if(text.length()==0) t1.requestFocus();
                    break;
                case R.id.second:
                    if(text.length()==1) t3.requestFocus();
                    if(text.length()==0) t1.requestFocus();
                    break;
                case R.id.third:
                    if(text.length()==1) t4.requestFocus();
                    if(text.length()==0) t2.requestFocus();
                    break;
                case R.id.fourth:
                    if(text.length()==1) t5.requestFocus();
                    if(text.length()==0) t3.requestFocus();
                    break;
                case R.id.fifth:
                    if(text.length()==1) t6.requestFocus();
                    if(text.length()==0) t4.requestFocus();
                    break;
                case R.id.sixth:
                    if(text.length()==0) {
                        t5.requestFocus();
                    } else {
                        // 第6位输入完成,触发PIN校验
                        validateMPIN();
                    }
                    break;
            }
        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {}

        @Override
        public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {}
    }

    // 独立的PIN校验方法,代码更清晰
    private void validateMPIN() {
        // 拼接6位输入的PIN
        String inputPIN = t1.getText().toString() +
                          t2.getText().toString() +
                          t3.getText().toString() +
                          t4.getText().toString() +
                          t5.getText().toString() +
                          t6.getText().toString();

        // 从SharedPreference读取保存的PIN
        SharedPreferences sp = getSharedPreferences("BankAppSettings", MODE_PRIVATE);
        String savedPIN = sp.getString(SP_SAVED_PIN_KEY, ""); // 空字符串为默认值,可根据实际调整

        // 对比校验
        if (inputPIN.equals(savedPIN)) {
            // 校验通过,跳转到目标页面
            Intent intent = new Intent(AboutUsActivity.this, HomeActivity.class); // 替换为你的目标Activity
            startActivity(intent);
            finish(); // 可选:关闭当前页面,防止用户返回重新输入
        } else {
            // 校验失败,弹出提示框
            new AlertDialog.Builder(AboutUsActivity.this)
                    .setTitle("PIN验证失败")
                    .setMessage("输入的PIN码不正确,请重新输入")
                    .setPositiveButton("确定", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // 清空所有输入框
                            t1.setText("");
                            t2.setText("");
                            t3.setText("");
                            t4.setText("");
                            t5.setText("");
                            t6.setText("");
                            // 焦点回到第一个输入框
                            t1.requestFocus();
                        }
                    })
                    .setCancelable(false)
                    .show();
        }
    }
}

额外注意事项

  • 确保你已经在用户设置PIN的环节,将正确的PIN写入到SharedPreference中
  • 建议给每个EditText设置inputType="number",限制只能输入数字,提升安全性
  • 若需要更高的安全性,可以使用EncryptedSharedPreference代替普通SharedPreference,避免PIN被明文读取

内容的提问来源于stack exchange,提问作者kalai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:47:35