Android中onEditorActionListener第二次触发不生效问题求助
问题根源
你遇到的问题核心是动态生成的新EditText没有继承原有输入框的配置和监听器,具体有三个错误点:
- 动态创建的新EditText只调用了
setSingleLine(),没有显式设置imeOptions为EditorInfo.IME_ACTION_DONE,导致后续软键盘显示回车键而不是DONE按钮 - 没有给新生成的EditText绑定你写好的
OnEditorActionListener监听器,所以就算显示了DONE按钮点击也不会触发逻辑 - 冗余代码
defaultEditText = newEditText.findViewById(newEditText.getId());写法错误,直接赋值即可,不需要调用findViewById
修正方案
在你创建新EditText的代码块里补充对应配置即可,修改后的对应代码如下:
// CREATING A EDITTEXT EditText newEditText = new EditText(MainActivity.this); newEditText.setWidth(defaultEditText.getWidth()); newEditText.setHeight(defaultEditText.getHeight()); newEditText.setId(View.generateViewId()); newEditText.setSingleLine(); // 新增:设置软键盘动作为DONE newEditText.setImeOptions(EditorInfo.IME_ACTION_DONE); // 新增:绑定监听器 newEditText.setOnEditorActionListener(doneButtonListener); // 新增:设置和原有输入框一致的输入类型,避免软键盘样式不一致 newEditText.setInputType(InputType.TYPE_CLASS_TEXT); ConstraintLayout.LayoutParams editTextParams = new ConstraintLayout.LayoutParams( ConstraintLayout.LayoutParams.WRAP_CONTENT, ConstraintLayout.LayoutParams.WRAP_CONTENT ); editTextParams.topToBottom = previousViewId; editTextParams.startToStart = previousViewId; editTextParams.endToEnd = params.endToEnd; // 新增:和原有输入框一样占满左右宽度 editTextParams.leftMargin = params.leftMargin; editTextParams.rightMargin = params.rightMargin; editTextParams.topMargin = 32; // 可自行调整上下元素间距 // 修正:直接赋值,不需要调用findViewById defaultEditText = newEditText; newEditText.setLayoutParams(editTextParams); constraintLayout.addView(newEditText); // 可选优化:自动给新输入框获取焦点、弹出软键盘,提升用户体验 newEditText.requestFocus(); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(newEditText, InputMethodManager.SHOW_IMPLICIT);
修改完成后每次点击DONE按钮都会正常生成新的输入框,且软键盘始终显示DONE按钮,监听器也会正常触发。
内容的提问来源于stack exchange,提问作者mockingbird
相关产品推荐
相关产品推荐

