Home » Android » android – EditText setError() with icon but without Popup message

android – EditText setError() with icon but without Popup message

Posted by: admin April 23, 2020 Leave a comment

Questions:

I want to to have some validation for my EditText wherein I want to show “enter image description here” icon (that comes when you put editText.setError("blah blah")) but don’t want the text in the popup displaying that “blah blah”.

Is there any way to do it? One way is to create a custom layout which will show the image icon in the EditText. But is there any better solution?

How to&Answers:

Problem solved after a lot of research and permutations- (Also thanks to @van)

Create a new class that will extend EditText something like this-

public class MyEditText extends EditText {

public MyEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
public void setError(CharSequence error, Drawable icon) {
    setCompoundDrawables(null, null, icon, null);
}
}

Use this class as a view in your xml like this-

<com.raj.poc.MyEditText
    android:id="@+id/et_test"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"/>

Now in the third step, just set a TextWatcher to your custom text view like this-

    et = (MyEditText) findViewById(R.id.et_test);

    errorIcon = getResources().getDrawable(R.drawable.ic_error);
    errorIcon.setBounds(new Rect(0, 0, errorIcon.getIntrinsicWidth(), errorIcon.getIntrinsicHeight()));
       et.setError(null,errorIcon);

    et.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(Editable s) {
            if(s.toString().length()>6){
                et.setError("", null);
            }else{
                et.setError("", errorIcon);
            }
        }
    });

where R.drawable.ic_error =

Keeping text null solves the problem
But if we keep only null in setError(null), this won’t show the validation error; it should be null along with second param.

Answer:

You dont need to create a new EditText class or change xml. The solution is very simple:

Edittext editText= (EditText) rootView.findViewById(R.id.email);

String str= editText.getText().toString();

if(str.equalsIgnoreCase("") ){

                Drawable dr = getResources().getDrawable(R.drawable.error); 
                                 //add an error icon to yur drawable files
                dr.setBounds(0, 0, dr.getIntrinsicWidth(), dr.getIntrinsicHeight());

                editText.setCompoundDrawables(null,null,dr,null);

            }

Answer:

Sorry Rajkiran, but your solution is not working on Android 4.2 version. If I am trying to set null value for error, it is not even displayed. The solution I came up was to extend EditText and override setError method. No I have only error indicator without popup.

@Override
public void setError(CharSequence pError, Drawable pIcon) {
    setCompoundDrawables(null, null, pIcon, null);
}

Answer:

I have been dealing with the same problem. I wanted to use .setError() to my EditText when user insert null input. But I think the pop-out message is annoying, especially when you have more EditTexts.
My solution was naive and simple, but it worked on all devices I’ve tried so far.

I created my own class myEditText and just @Override this method:

    @Override
    public void setError(CharSequence error, Drawable icon) {
       setCompoundDrawables(null, null, icon, null);
    }

then use in layout.xml

    <cz.project.myEditText
     ...
    />

and finally in my code
I put onFocusChangeListener to myEditText, so when someone clicks-in, the icon disappears.

    myEditText input = (myEditText) findViewById(R.id.input);
    input.setOnFocusChangeListener(new OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
            input.setError(null);
    });

    if(val == null) input.setError("");

It works Exactly how I want = no pop-up message when .setError() is called on EditText.

Answer:

To get only the error-icon without an error-message-popup only when setError("") is called (i.e. set an empty String as error-message) I use a custom EditText-class where I override setError(CharSequence, Drawable) like this:

@Override
public void setError(CharSequence error, Drawable icon) {
    if (error == null) {
        super.setError(null, icon);
        setCompoundDrawables(null, null, null, null);
    }
    else if (error.toString().equals("")) setCompoundDrawables(null, null, icon, null);
    else super.setError(error, icon);
}

Everything else stays the same:

Use setError(null) to get neither the icon nor the message-popup.

Use setError(errorMessage), where errorMessage is a String with length 1 at least, to get the icon and message-popup.

Answer:

This is the very useful when you want to show the error messages for the edittext field when the user enter wrong information.this is very simply program only you have to use serError() method in the edittext.

Step 1:
Create button and implement onclickListener.

btnLogin.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});

Step 2:
Validate the input fields and set the error in the input field.

if(edName.length()>3){
if(edNumber.length()>3){
Toast.makeText(getApplicationContext(), "Login success", Toast.LENGTH_SHORT).show();
}else{
edNumber.setError("Number Mininum length is 4");
}
}else{
edName.setError("Name Mininum length is 4");
}

Refer this link for more:http://velmuruganandroidcoding.blogspot.in/2014/08/set-error-message-in-edittext-android.html