Search code examples
androidandroid-layoutandroid-studioandroid-fragmentsandroid-textinputedittext

Design Android EditText to show error message on floating label hint


I need an EditText that looks like this onError:
enter image description here

calling onError looks like this:
enter image description here

Error message will show on top,floating label hint will change to error message. I tried some methods.but it won't come as per design.


Solution

  • Please try this one bro

     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.exa);
    
        inputLayoutEmail = (TextInputLayout) findViewById(R.id.input_layout_email);
        inputLayoutPassword = (TextInputLayout) findViewById(R.id.input_layout_password);
    
        inputEmail = (EditText) findViewById(R.id.input_email);
        inputPassword = (EditText) findViewById(R.id.input_password);
        btnSignUp = (Button) findViewById(R.id.btn_signup);
    
        inputEmail.addTextChangedListener(new MyTextWatcher(inputEmail));
        inputPassword.addTextChangedListener(new MyTextWatcher(inputPassword));
    
        btnSignUp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                submitForm();
            }
        });
    }
    
    private void submitForm() {
    
        if (!validateEmail()) {
            return;
        }
    
        if (!validatePassword()) {
            return;
        }
        Toast.makeText(getApplicationContext(), "Thank You!", Toast.LENGTH_SHORT).show();
    }
    
    private boolean validateEmail() {
    
        String email = inputEmail.getText().toString().trim();
        if (email.isEmpty() || !isValidEmail(email)) {
            inputLayoutEmail.setHint(getString(R.string.err_msg_email));
            requestFocus(inputEmail);
            return false;
        } else {
            inputLayoutEmail.setErrorEnabled(false);
            inputLayoutEmail.setHint("Email");
        }
    
        return true;
    }
    
    private boolean validatePassword() {
        if (inputPassword.getText().toString().trim().isEmpty()) {
            inputLayoutPassword.setHint(getString(R.string.err_msg_password));
            requestFocus(inputPassword);
            return false;
        } else {
            inputLayoutPassword.setErrorEnabled(false);
            inputLayoutPassword.setHint("Password");
        }
    
        return true;
    }
    
    private static boolean isValidEmail(String email) {
        return !TextUtils.isEmpty(email) && android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches();
    }
    
    private void requestFocus(View view) {
        if (view.requestFocus()) {
            getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        }
    }
    
    private class MyTextWatcher implements TextWatcher {
    
        private View view;
    
        private MyTextWatcher(View view) {
            this.view = view;
        }
    
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        }
    
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
        }
    
        public void afterTextChanged(Editable editable) {
            switch (view.getId()) {
                case R.id.input_email:
                    validateEmail();
                    break;
                case R.id.input_password:
                    validatePassword();
                    break;
            }
        }
    }