在 OnFocusChanged Listener 中保持对 Edittext 的关注
Retaining focus on Edittext within OnFocusChanged Listener
我正在尝试设置一个系统来验证用户输入,在这种情况下,只是检查用户是否输入了任何内容。
我有一个 Utility class
检查 EditText
是否有数据。
我正在使用 OnFocusChangeListener
,然后从 Utility class
.
调用方法
这是来自 activity
的代码:
editText = (EditText) view.findViewById(R.id.editText);
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
if (Utility.checkInput(editText) == false) {
Toast.makeText(getActivity(), "Enter value!",
Toast.LENGTH_SHORT).show();
// TODO....
// Retain focus - do not allow user to move on.
// This is where I am lost...
}
}
}
});
这是来自 Utility class
的代码:
public class Utility {
public static boolean checkInput(EditText editText) {
if (editText.getText().length() != 0) {
return true;
}
return false;
}
//.../
令我困惑的是,如果检查输入 returns 为假,如何保持焦点。我想阻止用户前进。我确信有一个简单的解决方案,但我还没有找到。
我也想知道 xml
ime.Options
是否会影响这个。
谢谢
编辑
这是我的 xml:
<EditText
android:imeOptions="actionDone"
android:inputType="textPersonName"
android:maxLength="24"/>
<spinner ../
<EditText
android:imeOptions="actionDone"
android:inputType="phone"
android:maxLength="12"/>
当我使用:
if (!hasFocus) {
if (Utility.checkInput(name) == false) {
Toast.makeText(AddDriverUserActivity.this, "Enter value!",Toast.LENGTH_SHORT).show();
name.requestFocus();
}
}
问题是,我正在使用完成操作(隐藏键盘),因为用户然后从微调器中选择然后继续下一个 EditText
。因此,在我触摸下一个编辑文本 (phone) 之前,toast 不会显示,然后焦点将设置在两个编辑文本上:
当我重置时:
android:imeOptions="actionDone"
到 actionNext
它显示祝酒词,然后继续下一个编辑文本,如屏幕截图所示,两者都被聚焦。
Request focus
不会阻止它从编辑文本中移出。
// Retain focus - do not allow user to move on.
editText.requestFocus();
这不是将 focus
保留在 EditText
中以验证输入的解决方案,但它是一种检查用户输入的优雅方式。
我将我所有的 EditText
添加到 array
并将它们传递给循环遍历数组并检查每个输入的方法。
在我的 Utility class
:
public static boolean checkAllInput(EditText[] editTexts) {
for (int i = 0; i < editTexts.length; i++) {
if (editTexts[i].getText().length() == 0) {
return false;
}
}
return true;
}
在activity/fragment:
我将 EditText 添加到一个数组中:
final EditText[] editTexts = {arg1, arg2, arg3, arg4, .../};
然后使用我的OnTouchListener
中的函数为button
。
addBtn.setOnTouchListener(new View.OnTouchListener() {
@Override public boolean onTouch(View v, MotionEvent event) {
hideKeyboard();
disableButton(addBtn);
if (Utility.checkAllInput(editTexts) == false) {
Toast.makeText(getActivity(), "Enter all fields",
Toast.LENGTH_SHORT).show();
enableButton(addBtn);
} else {
// Do something ..
}
return false;
}
});
我认为这可能对其他人在 android
中的工作有所帮助。
附带说明一下,我一直在禁用我的按钮,以防止重复触摸:
我正在尝试设置一个系统来验证用户输入,在这种情况下,只是检查用户是否输入了任何内容。
我有一个 Utility class
检查 EditText
是否有数据。
我正在使用 OnFocusChangeListener
,然后从 Utility class
.
这是来自 activity
的代码:
editText = (EditText) view.findViewById(R.id.editText);
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override public void onFocusChange(View v, boolean hasFocus) {
if (!hasFocus) {
if (Utility.checkInput(editText) == false) {
Toast.makeText(getActivity(), "Enter value!",
Toast.LENGTH_SHORT).show();
// TODO....
// Retain focus - do not allow user to move on.
// This is where I am lost...
}
}
}
});
这是来自 Utility class
的代码:
public class Utility {
public static boolean checkInput(EditText editText) {
if (editText.getText().length() != 0) {
return true;
}
return false;
}
//.../
令我困惑的是,如果检查输入 returns 为假,如何保持焦点。我想阻止用户前进。我确信有一个简单的解决方案,但我还没有找到。
我也想知道
xml
ime.Options
是否会影响这个。
谢谢
编辑
这是我的 xml:
<EditText
android:imeOptions="actionDone"
android:inputType="textPersonName"
android:maxLength="24"/>
<spinner ../
<EditText
android:imeOptions="actionDone"
android:inputType="phone"
android:maxLength="12"/>
当我使用:
if (!hasFocus) {
if (Utility.checkInput(name) == false) {
Toast.makeText(AddDriverUserActivity.this, "Enter value!",Toast.LENGTH_SHORT).show();
name.requestFocus();
}
}
问题是,我正在使用完成操作(隐藏键盘),因为用户然后从微调器中选择然后继续下一个 EditText
。因此,在我触摸下一个编辑文本 (phone) 之前,toast 不会显示,然后焦点将设置在两个编辑文本上:
当我重置时:
android:imeOptions="actionDone"
到 actionNext
它显示祝酒词,然后继续下一个编辑文本,如屏幕截图所示,两者都被聚焦。
Request focus
不会阻止它从编辑文本中移出。
// Retain focus - do not allow user to move on.
editText.requestFocus();
这不是将 focus
保留在 EditText
中以验证输入的解决方案,但它是一种检查用户输入的优雅方式。
我将我所有的 EditText
添加到 array
并将它们传递给循环遍历数组并检查每个输入的方法。
在我的 Utility class
:
public static boolean checkAllInput(EditText[] editTexts) {
for (int i = 0; i < editTexts.length; i++) {
if (editTexts[i].getText().length() == 0) {
return false;
}
}
return true;
}
在activity/fragment:
我将 EditText 添加到一个数组中:
final EditText[] editTexts = {arg1, arg2, arg3, arg4, .../};
然后使用我的OnTouchListener
中的函数为button
。
addBtn.setOnTouchListener(new View.OnTouchListener() {
@Override public boolean onTouch(View v, MotionEvent event) {
hideKeyboard();
disableButton(addBtn);
if (Utility.checkAllInput(editTexts) == false) {
Toast.makeText(getActivity(), "Enter all fields",
Toast.LENGTH_SHORT).show();
enableButton(addBtn);
} else {
// Do something ..
}
return false;
}
});
我认为这可能对其他人在 android
中的工作有所帮助。
附带说明一下,我一直在禁用我的按钮,以防止重复触摸: