Android 自定义编辑文本验证

Android 自定义编辑文本验证,android,android-edittext,Android,Android Edittext,我正在创建我的自定义EditText,用于验证电子邮件和其他关于focus lost的内容,如果无效,则返回focus。如果我只有一个EditText,它可以正常工作,但当我有多个EditText时,它会在我的EditText框之间无限聚焦,因为它会尝试检查两个框中的验证。这是我的示例代码 public void init(){ this.setOnFocusChangeListener(new OnFocusChangeListener() { @Override p

我正在创建我的自定义EditText,用于验证电子邮件和其他关于focus lost的内容,如果无效,则返回focus。如果我只有一个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();

    }
 });
}
public void init(){
this.setOnFocusChangeListener(新的OnFocusChangeListener(){
@凌驾
public void onFocusChange(视图v,布尔hasFocus){
//TODO自动生成的方法存根
最终MyEditText ed=MyEditText.this;
//检查是否需要现场验证
如果(!hasFocus&&isRequest){
if(ed.getText().toString().length()0){
ed.setError(空);
}
}
}
私有void setErrorMsg(最终编辑文本,字符串msg){
if(errorMessage!=null&&errorMessage.length()>0){
msg=错误消息;
}
ed.setError(msg);
ed.post(新Runnable(){
公开募捐{
ed.requestFocus();
}
});
}
以前

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

    }
});

并替换:

if(!hasFocus && isRequire){


最后,在此处使用新的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;
}
if(ed.getText().toString().length()0){
ed.setError(空);
}否则{
pedingFocus=false;
}

在视图组的父视图上启用焦点更改lisner获取子视图并选中它,u将获取相应的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("");
                }
            }
        }
TableLayout tableView=(TableLayout)findviewbyd(R.id.mydetails\u tableView);
查看mytempView=null;
int noOfChilds=tableView.getChildCount();
对于(int i=0;i
if(!hasFocus && isRequire && !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;
}
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("");
                }
            }
        }