自定义EditText验证

时间:2013-10-07 12:30:36

标签: android android-edittext

我正在创建我的自定义EditText,用于验证丢失焦点的电子邮件和其他内容,如果它无效,则重新关注。如果我只有一个EditText,它工作正常,但当我有多个EditText时,它无限远地聚焦在我的editText框之间,因为它试图检查两者中的验证。这是我的示例代码。

public void init(){

   this.setOnFocusChangeListener(new OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
    // TODO Auto-generated method stub
    final MyEditText ed = MyEditText.this;

    //...............check require field validation
    if(!hasFocus && isRequire){
      if(ed.getText().toString().length()<=0){
           String msg = "Require Field";
            v.clearFocus();
        setErrorMsg(ed,msg);

        return;
                            }
    }else if(ed.getText().toString().length()>0){
        ed.setError(null);
    }
    }
}

private void setErrorMsg(final EditText ed,String msg){

  if(errorMessage!=null && errorMessage.length()>0){
    msg = errorMessage;
   }

  ed.setError(msg); 

  ed.post(new Runnable() {
    public void run() {
       ed.requestFocus();

    }
 });
}

2 个答案:

答案 0 :(得分:1)

boolean pendingFocus = false;

之前

ed.post(new Runnable() {
    public void run() {
       ed.requestFocus();

    }
});

添加

pendingFocus = true;

和替换:

if(!hasFocus && isRequire){

if(!hasFocus && isRequire && !pendingFocus){

最后使用新的else语句重置pendingFocus:

  if(ed.getText().toString().length()<=0){
       String msg = "Require Field";
        v.clearFocus();
    setErrorMsg(ed,msg);

    return;
                        }
}else if(ed.getText().toString().length()>0){
    ed.setError(null);
}else{
    pedingFocus = false;
}

答案 1 :(得分:1)

将onfocus更改lisner放在viewGroup的父视图中获取子视图并确定它将获得特定的edittext。我有一些要求,就像我这样解决了。

TableLayout tableView = (TableLayout)findViewById(R.id.mydetails_tableview);
View mytempView=null;
        int noOfChilds=tableView.getChildCount();
        for(int i=0;i<noOfChilds;i++)
        {
            mytempView=tableView.getChildAt(i);
            if(i%2==0)
            {
                View vv=((TableRow) mytempView).getChildAt(1);
                if(vv instanceof EditText)
                {
                    //Log.v("This one is edit text---", "here there");
                    ((EditText) vv).setText("");
                }
            }
        }