Java 在OnFocusChanged侦听器中保持对Edittext的关注

Java 在OnFocusChanged侦听器中保持对Edittext的关注,java,android,focus,setfocus,imeoptions,Java,Android,Focus,Setfocus,Imeoptions,我试图建立一个系统来验证用户输入,在本例中,只是检查用户是否输入了任何内容 我有一个实用程序类,它检查编辑文本是否有数据 我正在使用一个onfocuschangelister,然后从实用程序类调用该方法 这是活动中的代码: editText = (EditText) view.findViewById(R.id.editText); editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @

我试图建立一个系统来验证用户输入,在本例中,只是检查用户是否输入了任何内容

我有一个
实用程序类
,它检查
编辑文本
是否有数据

我正在使用一个
onfocuschangelister
,然后从
实用程序类
调用该方法

这是
活动
中的代码:

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...

                }
            }
        }
    });
这是来自
实用程序类的代码:

public class Utility {
    public static boolean checkInput(EditText editText) {
        if (editText.getText().length() != 0) {
            return true;
        }
        return false;
    }
    //.../
public static boolean checkAllInput(EditText[] editTexts) {
    for (int i = 0; i < editTexts.length; i++) {
        if (editTexts[i].getText().length() == 0) {
            return false;
        }
    }
    return true;
}
  • 我遇到的难题是,如果检查输入返回false,如何保持焦点。我想阻止用户前进。我相信有一个简单的解决办法,但我还没有找到

  • 我还想知道
    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"/>
    
    问题是,我使用的是action done(隐藏键盘),用户从微调器中选择,然后进入下一个
    EditText
    。因此,在我触摸下一个编辑文本(手机)并将焦点设置为两个编辑文本之前,祝酒词不会显示:

    当我重置时:

    android:imeOptions=“actionDone”
    actionNext
    显示烤面包片,然后进入下一个编辑文本,如屏幕截图所示,两个文本都聚焦

    请求焦点
    不会阻止它从编辑文本中移动。

    使用


    这不是在
    EditText
    中保留
    focus
    以验证输入的解决方案,但它是检查用户输入的一种优雅方式

    我将所有的
    EditText
    s添加到
    数组
    中,并将它们传递给一个方法,该方法在数组中循环并检查每个输入

    在我的
    实用程序类中

    public class Utility {
        public static boolean checkInput(EditText editText) {
            if (editText.getText().length() != 0) {
                return true;
            }
            return false;
        }
        //.../
    
    public static boolean checkAllInput(EditText[] editTexts) {
        for (int i = 0; i < editTexts.length; i++) {
            if (editTexts[i].getText().length() == 0) {
                return false;
            }
        }
        return true;
    }
    
    然后将my
    OnTouchListener
    中的功能用于
    按钮

    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
    工作的人有所帮助

    作为补充说明,我一直在禁用我的按钮,以防止重复触摸:

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