求助:如何让Android自定义键盘支持在9个EditText中输入
解决自定义键盘支持多个EditText输入的方案
我之前也碰到过类似的问题,原代码之所以只能在单个EditText输入,大概率是因为它把输入操作硬绑定到了某一个固定的EditText实例上。要支持9个输入框,核心思路就是跟踪当前获得焦点的EditText,让键盘把内容输入到当前激活的那个输入框里。
下面是具体的实现步骤和代码示例:
1. 定义全局变量跟踪当前焦点输入框
先在你的Activity/Fragment里声明一个全局变量,用来保存当前正在被点击的EditText:
private EditText currentFocusedEt;
2. 给所有EditText绑定焦点监听器
假设你布局里的9个EditText分别是et1到et9,先通过findViewById获取它们的实例,然后给每个EditText设置统一的焦点监听器,这样不管用户点击哪个输入框,我们都能实时更新currentFocusedEt:
// 先获取所有EditText实例 EditText et1 = findViewById(R.id.et1); EditText et2 = findViewById(R.id.et2); EditText et3 = findViewById(R.id.et3); EditText et4 = findViewById(R.id.et4); EditText et5 = findViewById(R.id.et5); EditText et6 = findViewById(R.id.et6); EditText et7 = findViewById(R.id.et7); EditText et8 = findViewById(R.id.et8); EditText et9 = findViewById(R.id.et9); // 创建一个通用的焦点监听器 View.OnFocusChangeListener focusListener = new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { // 当输入框获得焦点时,更新全局变量 currentFocusedEt = (EditText) v; } // 这里不用刻意置空,因为其他输入框获得焦点时会自动覆盖 } }; // 给每个EditText绑定监听器 et1.setOnFocusChangeListener(focusListener); et2.setOnFocusChangeListener(focusListener); et3.setOnFocusChangeListener(focusListener); et4.setOnFocusChangeListener(focusListener); et5.setOnFocusChangeListener(focusListener); et6.setOnFocusChangeListener(focusListener); et7.setOnFocusChangeListener(focusListener); et8.setOnFocusChangeListener(focusListener); et9.setOnFocusChangeListener(focusListener);
3. 修改键盘按键的输入逻辑
原代码里的按键点击事件应该是直接把内容插入到某个固定EditText里,现在改成插入到currentFocusedEt中,记得先做非空判断避免空指针:
// 举个例子,这是自定义键盘上数字1的按键点击事件 btnNum1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (currentFocusedEt != null && currentFocusedEt.isEnabled()) { // 获取当前光标位置,插入字符(这样支持光标中间插入) int cursorPosition = currentFocusedEt.getSelectionStart(); currentFocusedEt.getText().insert(cursorPosition, "1"); } } }); // 其他按键(比如删除键)的逻辑也同理调整 btnDelete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (currentFocusedEt != null && currentFocusedEt.length() > 0) { int cursorPosition = currentFocusedEt.getSelectionStart(); if (cursorPosition > 0) { currentFocusedEt.getText().delete(cursorPosition - 1, cursorPosition); } } } });
额外注意事项
- 确保你的EditText布局属性里设置了
android:focusable="true"和android:focusableInTouchMode="true",这样它们才能获得焦点。 - 如果想阻止系统软键盘弹出,可以在Activity的
onCreate方法里添加:
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
或者给每个EditText添加onTouchListener,返回true拦截系统软键盘的触发:
et1.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { v.requestFocus(); return true; // 阻止系统软键盘弹出 } });
内容的提问来源于stack exchange,提问作者alz
相关产品推荐
相关产品推荐

