在android中第二次使用onEditorActionListener不起作用
Posted
技术标签:
【中文标题】在android中第二次使用onEditorActionListener不起作用【英文标题】:Using onEditorActionListener doesn't work for the second time in android 【发布时间】:2021-11-13 20:33:03 【问题描述】:我是 android 开发的新手,我想要实现的是:
当用户通过屏幕键盘(软输入法)点击完成按钮时,现有的默认editText
应该变成checkBox
并再次创建editText
以便用户可以输入一些再次数据。
这些我应该能够通过创建一个按钮并按下它来做到这一点,但我不想要一个按钮,我想要屏幕上的键盘交互,例如 DONE 按钮。
首先,我使用 onKeyListener 进行了尝试,但它在软键盘(手机)上不起作用,而是在笔记本电脑键盘等硬件键盘上起作用。
然后我也可以通过屏幕键盘使用onEditerActionListener()
执行上述功能,但只有一次我可以执行此操作,然后,“完成”按钮从屏幕上消失键盘,ENTER 按钮取代了 DONE 按钮。
编辑每当我使用editText.setSingleLine()
关注editText
时,我总是会出现“完成”,但这次当我点击editorActionListener
时不起作用?
我不知道为什么完成按钮不像我第一次点击时那样工作
XML:
<EditText
android:id="@+id/defaultEditText"
android:layout_
android:layout_
android:layout_marginStart="32dp"
android:layout_marginTop="32dp"
android:layout_marginEnd="32dp"
android:inputType="text"
android:textSize="20sp"
android:imeOptions = "actionDone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
安卓代码:
TextView.OnEditorActionListener doneButtonListener = ( new TextView.OnEditorActionListener()
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event)
if (actionId == EditorInfo.IME_ACTION_DONE)
//CREATING A CHECKBOX
CheckBox toDoCheckBox = new CheckBox(MainActivity.this);
toDoCheckBox.setText(defaultEditText.getText().toString());
toDoCheckBox.setTextSize(20);
toDoCheckBox.setId(View.generateViewId());
previousViewId = toDoCheckBox.getId();
ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) defaultEditText.getLayoutParams();
ConstraintLayout.LayoutParams newParams = new ConstraintLayout.LayoutParams(
ConstraintLayout.LayoutParams.WRAP_CONTENT,
ConstraintLayout.LayoutParams.WRAP_CONTENT
);
newParams.width = params.width;
newParams.height = params.height;
//Constraints
newParams.startToStart = params.startToStart;
newParams.endToEnd = params.endToEnd;
newParams.topToTop = params.topToTop;
newParams.topToBottom = params.topToBottom;
//Margins
newParams.leftMargin = params.leftMargin;
newParams.topMargin = params.topMargin;
newParams.rightMargin = params.rightMargin;
constraintLayout.addView(toDoCheckBox, -1, newParams);
defaultEditText.setVisibility(View.INVISIBLE);
// CREATING A EDITTEXT
EditText newEditText = new EditText(MainActivity.this);
newEditText.setWidth(defaultEditText.getWidth());
newEditText.setHeight(defaultEditText.getHeight());
newEditText.setId(View.generateViewId());
newEditText.setSingleLine();
ConstraintLayout.LayoutParams editTextParams = new ConstraintLayout.LayoutParams(
ConstraintLayout.LayoutParams.WRAP_CONTENT,
ConstraintLayout.LayoutParams.WRAP_CONTENT
);
if (isFirst)
editTextParams.topToBottom = previousViewId;
editTextParams.startToStart = previousViewId;
isFirst = false;
else
editTextParams.topToBottom = previousViewId;
editTextParams.startToStart = previousViewId;
defaultEditText = newEditText.findViewById(newEditText.getId());
newEditText.setLayoutParams(editTextParams);
constraintLayout.addView(newEditText);
return true;
return false;
);
defaultEditText.setOnEditorActionListener(doneButtonListener);
输出:
我正在重新发布这个问题,因为我没有得到我的问题的答案
【问题讨论】:
您需要在 EditText 中设置 'android:imeOptions="actionDone"' 您需要设置 imeOptions 并专注于您的第二次编辑,在运行时创建 newEditText.setImeOptions(EditorInfo.IME_ACTION_DONE);是的,我试过了,结果是,屏幕键盘消失了 专注于第二次编辑是什么意思? 'editText.requestFocus()' ,请求焦点使键盘和光标在editText上 【参考方案1】:您正在运行时创建新的编辑文本,您还需要为新的编辑文本初始化editor action lister
。
更新后的代码如下所示
defaultEditText = findViewById(R.id.defaultEditText);
defaultEditText.setOnEditorActionListener(this);
编辑器操作
@Override
public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent)
//CREATING A CHECKBOX
CheckBox toDoCheckBox = new CheckBox(TestingAcitvity.this);
toDoCheckBox.setText(defaultEditText.getText().toString());
toDoCheckBox.setTextSize(20);
toDoCheckBox.setId(View.generateViewId());
previousViewId = toDoCheckBox.getId();
ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) defaultEditText.getLayoutParams();
ConstraintLayout.LayoutParams newParams = new ConstraintLayout.LayoutParams(
ConstraintLayout.LayoutParams.WRAP_CONTENT,
ConstraintLayout.LayoutParams.WRAP_CONTENT
);
newParams.width = params.width;
newParams.height = params.height;
//Constraints
newParams.startToStart = params.startToStart;
newParams.endToEnd = params.endToEnd;
newParams.topToTop = params.topToTop;
newParams.topToBottom = params.topToBottom;
//Margins
newParams.leftMargin = params.leftMargin;
newParams.topMargin = params.topMargin;
newParams.rightMargin = params.rightMargin;
constraintLayout.addView(toDoCheckBox, -1, newParams);
defaultEditText.setVisibility(View.INVISIBLE);
// CREATING A EDITTEXT
EditText newEditText = new EditText(TestingAcitvity.this);
newEditText.setWidth(defaultEditText.getWidth());
newEditText.setHeight(defaultEditText.getHeight());
newEditText.setId(View.generateViewId());
newEditText.setSingleLine();
ConstraintLayout.LayoutParams editTextParams = new ConstraintLayout.LayoutParams(
ConstraintLayout.LayoutParams.WRAP_CONTENT,
ConstraintLayout.LayoutParams.WRAP_CONTENT
);
if (isFirst)
editTextParams.topToBottom = previousViewId;
editTextParams.startToStart = previousViewId;
isFirst = false;
else
editTextParams.topToBottom = previousViewId;
editTextParams.startToStart = previousViewId;
newEditText.requestFocus(); // request focus to focus on edit text
defaultEditText = newEditText.findViewById(newEditText.getId());
newEditText.setLayoutParams(editTextParams);
defaultEditText.setOnEditorActionListener(this); // set editor action listener
constraintLayout.addView(newEditText);
return true;
【讨论】:
我想不通,如何将editorActionListener设置为新创建的editText,所以我没有直接设置defaultEditText.setEditorActionListener(),而是尝试单独创建onEditorActionListener然后设置defaultEditText.setOnEditorActionListener,但是它没有用 在我的代码中可以清楚的看到,defaultEditText = newEditText.findViewById(newEditText.getId());我将 oldEditText 对象更改为新对象,这还不够吗?顺便说一句,你的建议完全符合我的要求 defaultEditText 现在包含新对象的值(新对象没有附加任何侦听器),这就是它不起作用的原因。【参考方案2】:在您的 edittext xml 中添加以下属性:
android:imeOptions="actionDone"
【讨论】:
对不起,我根据最近尝试的实现对程序进行了某些更改,android:imeOptions= "actionDone" 就是其中之一,我忘记提及了。以上是关于在android中第二次使用onEditorActionListener不起作用的主要内容,如果未能解决你的问题,请参考以下文章