1

我正在尝试建立一个系统来验证用户输入,在这种情况下,只是检查用户是否输入了任何内容。

我有一个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. 如果检查输入返回 false,我感到困惑的是如何保持焦点。我想阻止用户前进。我确信有一个简单的解决方案,但我还没有找到它。

  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();
      }
 }

问题是,我正在使用 action done (隐藏键盘),因为用户然后从微调器中进行选择,然后继续到下一个EditText. 因此,在我触摸下一个编辑文本(电话)之前,吐司不会显示,然后将焦点设置在两个编辑文本上:

在此处输入图像描述

当我重置时:

android:imeOptions="actionDone"actionNext它显示吐司,然后继续下一个编辑文本,如屏幕截图所示,两者都是焦点。

Request focus不会阻止它从编辑文本中移动。

4

2 回答 2

1

使用View.requestFocus()

// Retain focus - do not allow user to move on.
editText.requestFocus();
于 2015-07-19T02:57:08.220 回答
0

这不是保留验证输入的解决方案focusEditText但它是检查用户输入的一种优雅方式。

我将我的所有EditTexts 添加到 anarray并将它们传递给循环遍历数组并检查每个输入的方法。

在我的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;
}

在活动/片段中:

我将 EditTexts 添加到数组中:

final EditText[] editTexts = {arg1, arg2, arg3, arg4, .../};

然后使用 my 中的函数OnTouchListenerbutton.

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

作为旁注,我一直在禁用我的按钮,以防止重复触摸:
使用倒计时设置按钮启用

于 2015-07-19T05:35:58.037 回答