Подтвердить что ты не робот

EditText setError() со значком, но без всплывающего сообщения

Я хочу иметь некоторую проверку для моего EditText, в которой хочу показать " ввести описание изображения здесь" (появляется, когда вы помещаете editText.setError("blah blah")), но не хотите, чтобы текст во всплывающем меню отображал это "бла-бла".

Есть ли способ сделать это? Один из способов - создать пользовательский макет, который отобразит значок изображения в EditText. Но есть ли лучшее решение?

4b9b3361

Ответ 1

Проблема решена после большого количества исследований и перестановок - (Также благодаря @van)

Создайте новый класс, который расширит EditText что-то вроде этого -

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

Используйте этот класс как представление в вашем xml, как это -

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

Теперь на третьем шаге просто установите TextWatcher в свой пользовательский текстовый вид, например:

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

где R.drawable.ic_error= 1luXA.png

Сохранение текста null разрешает проблему Но если мы сохраняем только null в setError (null), это не покажет ошибку проверки; он должен быть нулевым вместе со вторым параметром.

Ответ 2

Вам не нужно создавать новый класс EditText или изменить xml. Решение очень просто:

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

            }

Ответ 3

Извините Rajkiran, но ваше решение не работает над версией Android 4.2. Если я пытаюсь установить значение null для ошибки, оно даже не отображается. Решение, которое я выбрал, заключалось в расширении EditText и переопределении метода setError. Нет. У меня есть только индикатор ошибки без всплывающего окна.

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

Ответ 4

Я имел дело с той же проблемой. Я хотел использовать .setError() для моего EditText, когда пользователь вводит нулевой ввод. Но я думаю, что всплывающее сообщение раздражает, особенно если у вас больше EditText s. Мое решение было наивным и простым, но оно работало на всех устройствах, которые я пробовал до сих пор.

Я создал свой собственный класс myEditText и просто @Override этот метод:

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

то используйте в layout.xml

    <cz.project.myEditText
     ...
    />

и, наконец, в моем коде Я помещал onFocusChangeListener в myEditText, поэтому, когда кто-то нажимает кнопку, значок исчезает.

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

Он работает Точно, как я хочу = нет всплывающего сообщения, когда .setError() вызывается на EditText.

Ответ 5

Чтобы получить только значок ошибки без всплывающего окна с сообщением об ошибке , только когда setError("") вызывается (т.е. установите пустую строку как сообщение об ошибке), я использую специальный класс EditText, где Я переопределяю setError(CharSequence, Drawable) следующим образом:

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

Все остальное остается неизменным:

Используйте setError(null), чтобы не получить ни значок, ни всплывающее сообщение.

Используйте setError(errorMessage), где errorMessage - это строка с длиной по крайней мере 1, чтобы получить значок и всплывающее сообщение.

Ответ 6

Это очень полезно, когда вы хотите отображать сообщения об ошибках для поля edittext, когда пользователь вводит неверную информацию. Это очень просто программа, вы должны использовать метод serError() в редакторе.

Шаг 1: Создать кнопку и реализовать onclickListener.

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

Шаг 2: Проверьте поля ввода и установите ошибку в поле ввода.

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

Подробнее см. эту ссылку: http://velmuruganandroidcoding.blogspot.in/2014/08/set-error-message-in-edittext-android.html