带有 setFocus 的 EditText OnKeyListener 未按预期工作
EditText OnKeyListener with setFocus not working as per expected
我正在使用带有物理硬件键盘的 Android 设备。
我在屏幕上有两个 EditTexts
(零件号和数量)和两个 Buttons
(重置和保存)。
用户输入数量后,他们想从物理键盘按 Enter 键以触发 "Save" 功能。
我当前的保存功能会将数据保存到文件并清除屏幕上的数据并将焦点设置为零件号
似乎我的 onKeyListener
没有 return True 一旦它被消耗并且它触发另一个 Enter 键操作将我的光标移动到 Qty 字段(正确地,它应该留在 Part No 字段)。
我以为 return True 表示这个 Enter 键已经被消耗了,我的理解对吗?
我的两个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"/>
下面是我的 Java 代码。
这是在 onCreate 方法中。
etQty.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View view, int i, KeyEvent keyEvent) {
if(i == KeyEvent.KEYCODE_ENTER){
saveData(null);
// I tried to use return true here, sames result, no different.
}
return false;
}
});
这是函数。
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);
在咨询了专家后,我才明白我也需要处理Action Up (Key Up)。
下面是工作代码。
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;
}
});
我正在使用带有物理硬件键盘的 Android 设备。
我在屏幕上有两个 EditTexts
(零件号和数量)和两个 Buttons
(重置和保存)。
用户输入数量后,他们想从物理键盘按 Enter 键以触发 "Save" 功能。
我当前的保存功能会将数据保存到文件并清除屏幕上的数据并将焦点设置为零件号
似乎我的 onKeyListener
没有 return True 一旦它被消耗并且它触发另一个 Enter 键操作将我的光标移动到 Qty 字段(正确地,它应该留在 Part No 字段)。
我以为 return True 表示这个 Enter 键已经被消耗了,我的理解对吗?
我的两个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"/>
下面是我的 Java 代码。
这是在 onCreate 方法中。
etQty.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View view, int i, KeyEvent keyEvent) {
if(i == KeyEvent.KEYCODE_ENTER){
saveData(null);
// I tried to use return true here, sames result, no different.
}
return false;
}
});
这是函数。
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);
在咨询了专家后,我才明白我也需要处理Action Up (Key Up)。
下面是工作代码。
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;
}
});