在 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;
    }
    //.../
  1. 令我困惑的是,如果检查输入 returns 为假,如何保持焦点。我想阻止用户前进。我确信有一个简单的解决方案,但我还没有找到。

  2. 我也想知道 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 不会阻止它从编辑文本中移出。

使用View.requestFocus()

// 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 中的工作有所帮助。

附带说明一下,我一直在禁用我的按钮,以防止重复触摸: