如何用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时,自动触发校验流程。具体实现步骤和修改后的代码如下:
核心实现步骤
- 拼接完整PIN码:当t6输入完成(文本长度为1)时,将t1到t6的内容拼接成完整的6位字符串
- 读取存储的PIN:从SharedPreference中取出用户预先保存的正确PIN码
- 对比校验:
- 若输入PIN与存储的一致:自动跳转到下一页面
- 若不一致:弹出错误提示框,清空所有输入框并将焦点放回第一个输入框
- 处理删除操作:当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
相关产品推荐
相关产品推荐

