H Raval
H Raval

Reputation: 1903

Custom EditText validation

i am creating my custom EditText which validate email and other things on focus lost and if it is not valid then focus back. It works fine if i have only one EditText but when i have multiple EditText it infinity focuses between my editText boxes as it try to check validation in both. Here is my sample code.

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

    }
 });
}

Upvotes: 0

Views: 544

Answers (2)

DropAndTrap
DropAndTrap

Reputation: 1630

Put onfocus change lisner on the parent view from the viewGroup get the child view and chek it u will get the perticular edittext. i had some requirement like that i solved it this way.

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

Upvotes: 1

Sherif elKhatib
Sherif elKhatib

Reputation: 45942

boolean pendingFocus = false;

Before

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

    }
});

Add

pendingFocus = true;

and Replace:

if(!hasFocus && isRequire){

with

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

Finally reset pendingFocus with a new else statement here:

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

Upvotes: 1

Related Questions