Android setFocus未按预期工作的EditText OnKeyListener
我正在使用带有物理硬件键盘的Android设备。Android setFocus未按预期工作的EditText OnKeyListener,android,android-edittext,onkeylistener,Android,Android Edittext,Onkeylistener,我正在使用带有物理硬件键盘的Android设备。 我在屏幕上有两个编辑文本(零件号和数量)和两个按钮(重置和保存)。 用户输入数量后,他们想按物理键盘上的[strong>回车[strong]键触发“保存”功能。 我当前的保存功能将数据保存到文件中,清除屏幕上的数据,并将焦点设置为零件号。 似乎我的onkeylister在被使用后没有返回True,它触发了另一个Enter键操作,将光标移动到Qty字段(右边,它应该保留在Part No字段中) 我以为return True将指示此回车键已被使用,我
我在屏幕上有两个
编辑文本(零件号和数量)和两个按钮(重置和保存)。
用户输入数量后,他们想按物理键盘上的[strong>回车[strong]键触发“保存”功能。
我当前的保存功能将数据保存到文件中,清除屏幕上的数据,并将焦点设置为零件号。
似乎我的onkeylister
在被使用后没有返回True,它触发了另一个Enter键操作,将光标移动到Qty字段(右边,它应该保留在Part No字段中)
我以为return True将指示此回车键已被使用,我的理解正确吗?
我的两个EditText
直接放在ConstraintLayout
下(不在任何子布局下)。
知道我的代码哪里出错了吗?
下面是我的布局代码。
<EditText
android:id="@+id/etPart"
android:layout_width="200dp"
android:maxLength="20"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:maxLines="1"
android:inputType="text"
android:imeOptions="actionNext"
app:layout_constraintLeft_toRightOf="@+id/tvPart"
app:layout_constraintTop_toTopOf="parent"/>
<EditText
android:id="@+id/etQty"
android:layout_width="100dp"
android:maxLength="5"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:inputType="number"
android:maxLines="1"
android:imeOptions="actionDone"
app:layout_constraintLeft_toRightOf="@+id/tvQty"
app:layout_constraintTop_toBottomOf="@id/etPart"
android:nextFocusDown="@id/etPart"/>
这就是函数。
public void saveData(View view) {
// check and save data to file logic.
// ...... etc.
mProductViewModel.insert(product);
resetView(null);
}
public void resetView(View view) {
etPart.setText(null);
etQty.setText(null);
// I am expecting the focus will stay in Part No box but it is not. It will jump to Qty field.
etPart.requestFocus();
}
这通常是软键盘造成的,你能试试这个代码吗
etPart.requestFocus();
final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.restartInput(etPart);
imm.showSoftInput(etPart, 0);
在与专家核实后,我了解到我也需要处理行动(关键行动)。
以下是工作代码。
etQty.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View view, int i, KeyEvent keyEvent) {
if(i == KeyEvent.KEYCODE_ENTER && keyEvent.getAction() == KeyEvent.ACTION_UP){
saveData(null);
return true;
}
return false;
}
});
谢谢你的建议。我试过了,结果还是一样。光标将在etPart中停留数毫秒,然后跳转到etQty。(我试图编辑此评论以包含您的姓名,但不知道为什么,我无法使用“@”来包含您的姓名。对此表示抱歉)。请尝试setText(“”
)而不是null谢谢您的快速回复。我尝试使用setText(“”),但它仍然是一样的。好的,我能找到的最后一个解决方案是,将返回true
放在中,如果(I==KeyEvent.KEYCODE_ENTER){
并结合我的所有建议,看看它是否有效,我刚刚做的,它仍然是一样的(仅供参考:我使用的是带有硬件键盘的工业安卓条形码终端,不确定是因为公司设计硬件键的方式导致了这个问题还是纯粹的程序错误,我尝试了几种在线查找的方法,在这个stackoverflow中,所有方法似乎都不起作用)。我将创建一个简单的应用程序模型,然后再试一次(希望只是我的一些设置或布局搞砸了)。
etQty.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View view, int i, KeyEvent keyEvent) {
if(i == KeyEvent.KEYCODE_ENTER && keyEvent.getAction() == KeyEvent.ACTION_UP){
saveData(null);
return true;
}
return false;
}
});