0

我正在创建我的自定义 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();

    }
 });
}
4

2 回答 2

1

将焦点更改 lisner 放在 viewGroup 的父视图上,获取子视图并检查它,您将获得特定的编辑文本。我有一些这样的要求,我以这种方式解决了它。

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("");
                }
            }
        }
于 2013-10-07T12:40:29.447 回答
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;
}
于 2013-10-07T12:37:39.923 回答