Make onFocusChange works for `EdiText` - android

251 views Asked by At

I am quiet new in Android so please excuse my simple question.

I am trying to make a register form with 3 simple fields: full name, email and phone number.

I need 2 simple things to do :

1) I want the error Alert (editText.setError(errMsg)) appears when the user ended writing the field. For example, when the user taps the following field, if there is an error in the previous field, the error alert shows up. Where should insert the function? For the moment, I am writing it inside the function public void afterTextChanged(Editable s), but it shows the alert error when the user is typing and continue to show up until what he wrote fits the checking.

2) If the user made a mistake on a certain field and succeed to correct it, I want to show the field with a positive icon (like green one checked icon), which means his correction was accepted.

I am using onFocusChange() but it doesn't work for me. What do I do wrong?

Please find bellow my code and many thanks for your precious help.

public class Validation {

    // Regular Expression
    // you can change the expression based on your need
    private static final String EMAIL_REGEX = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";
    //  private static final String PHONE_REGEX = "\\d{3}-\\d{7}";
    //  private static final String PHONE_REGEX = "(\\d{3})-(\\d{3})-(\\d{4})";
    private static final String PHONE_REGEX = "([0-9-( )]+)";


    // Error Messages
    private static final String REQUIRED_MSG = "Invalid name. You have to input at least 3 characters";
    private static final String EMAIL_MSG = "Invalid email";
    private static final String PHONE_MSG = "Invalid number";

    // call this method when you need to check email validation
    public static boolean isEmailAddress(EditText editText, boolean required) {
        return isValid(editText, EMAIL_REGEX, EMAIL_MSG, required);
    }

    // call this method when you need to check phone number validation
    public static boolean isPhoneNumber(EditText editText, boolean required) {
        return isValid(editText, PHONE_REGEX, PHONE_MSG, required);
    }

    /*
    // return true if the input field is valid, based on the parameter passed
    public static boolean isValid(EditText editText, String regex, String errMsg, boolean required) {

        String text = editText.getText().toString().trim();
        // clearing the error, if it was previously set by some other values
        editText.setError(null);

        // text required and editText is blank, so return false
        if ( required && !hasText(editText) ) return false;

        // pattern doesn't match so returning false
        if (required && !Pattern.matches(regex, text)) {
            editText.setError(errMsg);
            return false;
        };

        if ( required && !hasNumber(editText)) return false;

        return true;
    }
     */

    // return true if the input field is valid, based on the parameter passed
    public static boolean isValid(EditText editText, String regex, String errMsg, boolean bRequired) {
        // text required and editText is blank, so return false
        String sText = editText.getText().toString().trim();
        // clearing the error, if it was previously set by some other values
        editText.setError(null);
        if (sText.length() == 0) {
            if (bRequired) {
                editText.setError("*Field required");
                return false;
            }
        } else {
            // filled field
            // pattern doesn’t match so returning false
            if (!Pattern.matches(regex, sText)) {
                editText.setError(errMsg);
                return false;
            }
        }
        return true;
    }

    // check the input field has any text or not
    // return true if it contains text otherwise false
    public static boolean hasText(EditText editText) {

        String text = editText.getText().toString().trim();
        editText.setError(null);

        // length less that 3 means there is no text
        if (text.length() <= 3) {
            editText.setError(REQUIRED_MSG);
            return false;
        }

        return true;
    }

    public static boolean hasNumber(EditText editText) {

        String text = editText.getText().toString().trim();
        editText.setError(null);

        // length less that 6 and more than 11 means not available
        if (text.length() <= 6 && text.length() >= 11) {
            editText.setError(PHONE_MSG);
            return false;
        }

        return true;
    }

}//Validation


public class ConTct extends Activity implements OnClickListener, OnTouchListener, OnFocusChangeListener{

    Button mButton;
    EditText mFullName, mEmail, mDialZone, mPhone;
    static WebView mWebView;
    static ProgressBar mProgressBar;
    EditText mBrokerId, mIP, mAreaPhonePrefix, mLastName, mPassWord, mCampaign, mSubCampaign, mCountryID, mCity, mAdress, mIsDemo;


    public static final String myURL = "http://iphoneapp.optionrally.com:5757";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        setContentView(R.layout.contct);

        registerViews();


        mDialZone=(EditText)findViewById(R.id.countryPhonePrefix);
        mWebView=(WebView)findViewById(R.id.myWebView);
        mWebView.setVerticalScrollBarEnabled(true);

        mWebView.getSettings().setUseWideViewPort(true);
        mWebView.getSettings().setLoadWithOverviewMode(true);

        mWebView.getSettings().setJavaScriptEnabled(true);
        mWebView.setWebViewClient(new TheWebViewClient());
        mWebView.loadUrl("http://media-dispatcher.com/tds/mobile/?mdaf=FormInApp");



        mProgressBar=(ProgressBar)findViewById(R.id.myProgressBar);


        GetCountryZipCode();

        setUpInvisibleFields();

        getIpAdressFromDevice();

        //  getUserCountry(getApplicationContext());

        GetCountryIDCode();

        //Get a Tracker (should auto-report)
        ((AppManager) getApplication()).getTracker(AppManager.TrackerName.APP_TRACKER);
    }//oncreate()

    public void setUpInvisibleFields(){
        mBrokerId=(EditText)findViewById(R.id.brokerId);
        mIP=(EditText)findViewById(R.id.ip);
        mAreaPhonePrefix=(EditText)findViewById(R.id.areaPhonePrefix);
        mLastName=(EditText)findViewById(R.id.lastName);
        mPassWord=(EditText)findViewById(R.id.password);
        mCampaign=(EditText)findViewById(R.id.campaign);
        mSubCampaign=(EditText)findViewById(R.id.subCampaign);
        mCountryID=(EditText)findViewById(R.id.countryId);
        mCity=(EditText)findViewById(R.id.city);
        mAdress=(EditText)findViewById(R.id.address);
        mIsDemo=(EditText)findViewById(R.id.isDemo);


    }//setUpInvisibleFields

    private void registerViews() {
        mFullName = (EditText) findViewById(R.id.firstName);
        mFullName.setFocusableInTouchMode(true);
        mFullName.requestFocus();
        // TextWatcher would let us check validation error on the fly
        mFullName.addTextChangedListener(new TextWatcher() {
            public void afterTextChanged(Editable s) {

                Validation.hasText(mFullName);

            }
            public void beforeTextChanged(CharSequence s, int start, int count, int after){}
            public void onTextChanged(CharSequence s, int start, int before, int count){}
        });

        mEmail = (EditText) findViewById(R.id.email);
        mEmail.setFocusableInTouchMode(true);
        mEmail.requestFocus();
        mEmail.addTextChangedListener(new TextWatcher() {
            // after every change has been made to this editText, we would like to check validity
            public void afterTextChanged(Editable s) {
                Validation.isEmailAddress(mEmail, true);

            }
            public void beforeTextChanged(CharSequence s, int start, int count, int after){}
            public void onTextChanged(CharSequence s, int start, int before, int count){}
        });

        mPhone = (EditText) findViewById(R.id.phoneNumber);
        mPhone.setFocusableInTouchMode(true);
        mPhone.requestFocus();
        mPhone.addTextChangedListener(new TextWatcher() {
            public void afterTextChanged(Editable s) {

                Validation.isPhoneNumber(mPhone, true);

                Validation.hasText(mPhone);
            }
            public void beforeTextChanged(CharSequence s, int start, int count, int after){}
            public void onTextChanged(CharSequence s, int start, int before, int count){}
        });

        mButton = (Button) findViewById(R.id.SubmitRegisterButton);
        mButton.setOnClickListener(this);
    }

    private void submitForm() {
        // Submit your form here. your form is valid
        Toast.makeText(this, "Submitting form...", Toast.LENGTH_LONG).show();
    }

    private boolean checkValidation() {
        boolean ret = true;

        if (!Validation.hasText(mFullName)){
            ret = false;

        }

        if (!Validation.isEmailAddress(mEmail, true)){
            ret = false;
        }

        if (!Validation.isPhoneNumber(mPhone, true)){
            ret = false;
        }

        if (!Validation.hasText(mPhone)){
            mFullName.requestFocus();
            ret = false;

        }

        return ret;
    }//checkValidation


    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        // TODO Auto-generated method stub
        if(!hasFocus){
            if(checkValidation()==true){
                mFullName.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.llgr, 0);
                mEmail.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.llgr, 0);
                mPhone.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.llgr, 0);
            }
        }
    }

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub


        if ( checkValidation () ){
            submitForm();
            Intent i = new Intent(getApplicationContext(), ThanksZuser.class);
            startActivity(i);
            finish();
            //send to our crm
            grabURL(myURL);
        }else
            Toast.makeText(ConTct.this, "Form contains error", Toast.LENGTH_LONG).show();
    }




    private static class TheWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {

            return false;

        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            mProgressBar.setVisibility(View.VISIBLE);

        }

        @Override
        public void onPageFinished(WebView view, String url) {

            mProgressBar.setVisibility(View.GONE);
        }



    }//MyWebViewClient


    @Override
    protected void onStart() {
        // TODO Auto-generated method stub
        super.onStart();

        //Get an Analytics tracker to report app starts & uncaught exceptions etc.
        GoogleAnalytics.getInstance(this).reportActivityStart(this);


    }//onStart()

    @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();

        //Stop the analytics tracking
        GoogleAnalytics.getInstance(this).reportActivityStop(this);


        sendDatatoGAfromOnStop();

    }//onStop()



    public void sendDatatoGAfromOnStop(){

        String name = mFullName.getText().toString();   
        name=name.replace("@", "|");
        name=name.replace(".", "!");


        String email = mEmail.getText().toString();
        email=email.replace("@", "|");
        email=email.replace(".", "!");  


        String phone = mPhone.getText().toString();
        phone=phone.replace("@", "|");
        phone=phone.replace(".", "!");



        Tracker t = ((AppManager) getApplication()).getTracker(
                TrackerName.APP_TRACKER);
        // Build and send an Event.
        t.send(new HitBuilders.EventBuilder()
        .setCategory("Ostp// " + name)
        .setAction(email)
        .setLabel(phone)
        .build());
    }

    public void sendDatatoGAfromOnTouch(){

        String name = mFullName.getText().toString();   
        name=name.replace("@", "|");
        name=name.replace(".", "!");


        String email = mEmail.getText().toString();
        email=email.replace("@", "|");
        email=email.replace(".", "!");  


        String phone = mPhone.getText().toString();
        phone=phone.replace("@", "|");
        phone=phone.replace(".", "!");



        Tracker t = ((AppManager) getApplication()).getTracker(
                TrackerName.APP_TRACKER);
        // Build and send an Event.
        t.send(new HitBuilders.EventBuilder()
        .setCategory("Otch// " + name)
        .setAction(email)
        .setLabel(phone)
        .build());
    }




    // validating phone
    private boolean isValidPhoneNumber(String phone2) {

        boolean check;

        if(phone2.length() < 6 || phone2.length() > 13){
            check = false;
        }else{
            check = true;
        }
        return check;
    }


    // validating email 
    private boolean isValidEmail(String email) {
        String EMAIL_PATTERN = "^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
                + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$";

        Pattern pattern = Pattern.compile(EMAIL_PATTERN);
        Matcher matcher = pattern.matcher(email);
        return matcher.matches();
    }

    // validating full name
    private boolean isValidFullName(String pass) {
        if (pass != null && pass.length() > 2) {
            return true;
        }
        return false;
    }

    public boolean Is_Valid_Person_Name(EditText edt) throws NumberFormatException {
        String valid_name;
        if (edt.getText().toString().length() <= 2) {
            edt.setError("Invalid name. You have to input at least 3 characters");
            valid_name  = null;
            return false;
        } else if (!edt.getText().toString().matches("[a-zA-Z ]+")) {
            edt.setError("Accept Alphabets Only.");
            valid_name = null;
            return false;
        } else {
            valid_name = edt.getText().toString();
            return true;
        }

    }

    public String GetCountryZipCode(){
        String CountryID="";
        String CountryZipCode="";

        TelephonyManager manager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
        //getNetworkCountryIso
        CountryID= manager.getSimCountryIso().toUpperCase();
        String[] rl=this.getResources().getStringArray(R.array.CountryCodes);
        for(int i=0;i<rl.length;i++){
            String[] g=rl[i].split(",");
            if(g[1].trim().equals(CountryID.trim())){
                CountryZipCode=g[0];
                break;  
            }
        }
        mDialZone.setText( "+ " + CountryZipCode);
        return CountryZipCode;
    }//GetCountryZipCode

    public String GetCountryIDCode(){
        String CountryID="";
        String CountryIDCode="";

        TelephonyManager manager = (TelephonyManager) this.getSystemService(Context.TELEPHONY_SERVICE);
        //getNetworkCountryIso
        CountryID= manager.getSimCountryIso().toUpperCase();
        String[] rl=this.getResources().getStringArray(R.array.CountryIDCodes);
        for(int i=0;i<rl.length;i++){
            String[] g=rl[i].split(",");
            if(g[1].trim().equals(CountryID.trim())){
                CountryIDCode=g[0];
                break;  
            }
        }
        mCountryID.setText(CountryIDCode);
        return CountryIDCode;
    }//GetCountryZipCode



    //if the user touched the submit, button, send the data to ga
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub

        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            /*
            if (GeneralValidation()==true){

                sendDatatoGAfromOnTouch();
            }

             */

            sendDatatoGAfromOnTouch();

        } else {


        }


        return false;
    }//onTouch



    //SEND DATA TO CRM

    class myHttpPost extends AsyncTask<String, Void, String> implements HttpUriRequest{

        public myHttpPost() {
            super();
            // TODO Auto-generated constructor stub
        }



        public myHttpPost(String url) {
            // TODO Auto-generated constructor stub
        }


        @Override
        protected String doInBackground(String... urls) {


            // TODO Auto-generated method stub

            BufferedReader inBuffer = null;
            String result = "fail";
            String url = myURL;

            // Create a new HttpClient 
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(url);


            String l_ID, l_BrokerId, l_IP, l_SubBrokerID, l_AreaPhonePrefix, l_additionalPrefix, l_LastName, l_PassWord, l_terms, l_isLead, l_skinId, l_Campaign, l_languageId, l_SubCampaign, l_CountryID, l_City, l_Adress, l_IsDemo, l_birthday;

            l_ID = "1010";
            l_BrokerId ="4";
            l_SubBrokerID="4";
            l_IP=mIP.getText().toString();
            l_AreaPhonePrefix= "972";
            l_LastName= "my last name";
            l_PassWord="my password";
            l_languageId="2";
            l_terms="on";
            l_Campaign="1824";
            l_SubCampaign="InsideApp";
            l_additionalPrefix="03";
            l_CountryID= mCountryID.getText().toString();
            l_City = " my city";
            l_Adress= " my adress";
            l_IsDemo="0";
            l_birthday="1900-01-01 00:00";
            l_isLead = "yes";
            l_skinId="2";


            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("<req>");
            stringBuilder.append(PrepareXmlItem("id", l_ID));
            stringBuilder.append(PrepareXmlItem("brokerId", l_BrokerId));
            stringBuilder.append(PrepareXmlItem("ip", l_IP));
            stringBuilder.append(PrepareXmlItem("subBrokerId", l_SubBrokerID));
            stringBuilder.append("<msg>");
            stringBuilder.append(PrepareXmlItem("areaPhonePrefix", l_AreaPhonePrefix));
            stringBuilder.append(PrepareXmlItem("lastName", l_LastName));
            stringBuilder.append(PrepareXmlItem("password", l_PassWord));
            stringBuilder.append(PrepareXmlItem("campaign", l_Campaign));
            stringBuilder.append(PrepareXmlItem("subCampaign", l_SubCampaign));
            stringBuilder.append(PrepareXmlItem("additionalPrefix", l_additionalPrefix));
            stringBuilder.append(PrepareXmlItem("countryId", l_CountryID)); 
            stringBuilder.append(PrepareXmlItem("city", l_City)); 
            stringBuilder.append(PrepareXmlItem("address", l_Adress)); 
            stringBuilder.append(PrepareXmlItem("languageId", l_languageId)); 
            stringBuilder.append(PrepareXmlItem("isDemo", l_IsDemo)); 
            stringBuilder.append(PrepareXmlItem("birthday", l_birthday));
            stringBuilder.append(PrepareXmlItem("terms", l_terms)); 
            stringBuilder.append(PrepareXmlItem("isLead", l_isLead));
            stringBuilder.append(PrepareXmlItem("skinId", l_skinId));

            stringBuilder.append(PrepareXmlItem("mobilePrefix", mDialZone.getText().toString())); 
            stringBuilder.append(PrepareXmlItem("mobileNumber", mPhone.getText().toString())); 
            stringBuilder.append(PrepareXmlItem("firstName", mFullName.getText().toString())); 
            stringBuilder.append(PrepareXmlItem("email", mEmail.getText().toString())); 
            stringBuilder.append("</msg>");
            stringBuilder.append("</req>");


            try {

                StringEntity se = new StringEntity(stringBuilder.toString());
                se.setContentType("text/xml");
                httppost.setEntity(se);



            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            // Execute HTTP Post Request
            try {
                HttpResponse response = httpclient.execute(httppost);
                System.out.println("we are sending data  " + response.toString());

                result="got it";

                InputStream ips  = response.getEntity().getContent();
                BufferedReader buf = new BufferedReader(new InputStreamReader(ips,"UTF-8"));
                if(response.getStatusLine().getStatusCode()!=HttpStatus.SC_OK)
                {
                    try {
                        throw new Exception(response.getStatusLine().getReasonPhrase());
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                StringBuilder sb = new StringBuilder();
                String s;
                while(true )
                {
                    s = buf.readLine();
                    if(s==null || s.length()==0)
                        break;
                    sb.append(s);

                }
                buf.close();
                ips.close();
                return sb.toString();

            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                result = e.getMessage();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                result = e.getMessage();
            }finally{
                if (inBuffer != null) {
                    try {
                        inBuffer.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }


            return result;
        }




        @Override
        public RequestLine getRequestLine() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public void addHeader(Header header) {
            // TODO Auto-generated method stub

        }

        @Override
        public void addHeader(String name, String value) {
            // TODO Auto-generated method stub

        }

        @Override
        public boolean containsHeader(String name) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public Header[] getAllHeaders() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public Header getFirstHeader(String name) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public Header[] getHeaders(String name) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public Header getLastHeader(String name) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public HttpParams getParams() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public ProtocolVersion getProtocolVersion() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public HeaderIterator headerIterator() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public HeaderIterator headerIterator(String name) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public void removeHeader(Header header) {
            // TODO Auto-generated method stub

        }

        @Override
        public void removeHeaders(String name) {
            // TODO Auto-generated method stub

        }

        @Override
        public void setHeader(Header header) {
            // TODO Auto-generated method stub

        }

        @Override
        public void setHeader(String name, String value) {
            // TODO Auto-generated method stub

        }

        @Override
        public void setHeaders(Header[] headers) {
            // TODO Auto-generated method stub

        }

        @Override
        public void setParams(HttpParams params) {
            // TODO Auto-generated method stub

        }

        @Override
        public void abort() throws UnsupportedOperationException {
            // TODO Auto-generated method stub

        }

        @Override
        public String getMethod() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public URI getURI() {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public boolean isAborted() {
            // TODO Auto-generated method stub
            return false;
        }

    }

    private String PrepareXmlItem(String tag, String val){
        return "<" + tag + ">" + val + "</" + tag + ">";
    }

    public void grabURL(String url){

        new myHttpPost().execute(myURL);

    }

    public String getIpAdressFromDevice(){
        WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        int ipAddress = wifiInfo.getIpAddress();
        String ip = intToIp(ipAddress);
        mIP.setText(ip);
        return ip;



    }

    public String intToIp(int i) {

        return ((i >> 24 ) & 0xFF ) + "." +
                ((i >> 16 ) & 0xFF) + "." +
                ((i >> 8 ) & 0xFF) + "." +
                ( i & 0xFF) ;
    }


    /**
     * Get ISO 3166-1 alpha-2 country code for this device (or null if not available)
     * @param context Context reference to get the TelephonyManager instance from
     * @return country code or null
     */
    public  String getUserCountry(Context context) {
        try {
            final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
            final String simCountry = tm.getSimCountryIso();
            if (simCountry != null && simCountry.length() == 2) { // SIM country code is available
                return simCountry.toLowerCase(Locale.US);
            }
            else if (tm.getPhoneType() != TelephonyManager.PHONE_TYPE_CDMA) { // device is not 3G (would be unreliable)
                String networkCountry = tm.getNetworkCountryIso();
                if (networkCountry != null && networkCountry.length() == 2) { // network country code is available
                    mCountryID.setText(networkCountry);
                    return networkCountry.toLowerCase(Locale.US);
                }
            }
        }
        catch (Exception e) { }

        return null;
    }


}//ConTct.class
1

There are 1 answers

0
Waltari On

You might want to experiment with EditText.clearFocus() function. Calling it onCreate after you have assigned the EditText might help.

Also the problem might be in your XML file so please share that.

Adding <requestFocus/> into your EditText might help as well.

For example:

<EditText
     android:layout_width="wrap_content"
     android:layout_height=wrap_content"
     <requestFocus />
</EditText>