Android点击Button向EditText传值时覆盖原有文本如何解决
问题解答
你需要的点击按钮追加文本、不覆盖原有内容的效果完全可以实现,只需要调整现有代码的文本赋值逻辑即可。
问题原因
当前代码点击事件中调用的txtPass.setText(text)会直接替换EditText的全部内容,这是新文本覆盖旧内容的直接原因。
另外你当前在循环中提前获取按钮文本传入监听器的写法存在潜在风险:如果后续有动态修改按钮文本的逻辑,监听器拿到的会是初始化时的旧文本,不是按钮当前显示的内容。
修改方案
调整点击事件逻辑:触发点击时,先获取当前被点击按钮上的真实显示文本,再读取EditText中已存在的内容,将两者拼接后重新设置给EditText即可。如果需要优化输入体验,可以在设置完文本后将光标自动移动到内容末尾。
修正后的完整代码如下:
private void LoadBtnNumbers(){ Button[] btn = new Button[] { (Button) findViewById(R.id.btn1), (Button) findViewById(R.id.btn2), (Button) findViewById(R.id.btn3), (Button) findViewById(R.id.btn4), (Button) findViewById(R.id.btn5), (Button) findViewById(R.id.btn6), (Button) findViewById(R.id.btn7), (Button) findViewById(R.id.btn8), (Button) findViewById(R.id.btn9), }; ArrayList<String> array = new ArrayList<>(); array.add("1"); array.add("2"); array.add("3"); array.add("4"); array.add("5"); array.add("6"); array.add("7"); array.add("8"); array.add("9"); for(int i = 0; i < btn.length; i++) { Random rand = new Random(); String newString = array.get(rand.nextInt(array.size())); btn[i].setText(newString); array.remove(newString); btn[i].setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 点击时从当前按钮控件获取最新显示文本 String clickText = ((Button) v).getText().toString(); Log.e("BTN", "NUMBER = " + clickText); // 读取已有内容,拼接新文本后赋值,不直接覆盖 String originContent = txtPass.getText().toString(); txtPass.setText(originContent + clickText); // 可选:光标移到末尾,符合常规输入习惯 txtPass.setSelection(txtPass.getText().length()); } }); } }
扩展说明
- 如果需要做输入长度限制(比如密码固定6位),可以在拼接前判断
originContent.length(),达到长度阈值后直接return,不再执行拼接逻辑 - 如果需要实现删除功能,可以新增一个删除按钮,点击时取当前内容去掉最后一位后再设置回EditText即可
内容的提问来源于stack exchange,提问作者Chika
相关产品推荐
相关产品推荐

