2012-01-24 2 views
24

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

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

ответ

34

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

Создайте новый класс, который продлит EditText что-то вроде 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); 
} 
} 

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

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

Сейчас на третьем этапе, просто установите TextWatcher на ваш произвольный текст вид как 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); 
      } 
     } 
    }); 

, где R.drawable.ic_error =

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

+2

Таким образом, значок не исчезнет при изменении текста. – Vincent

+1

Да значок не исчезает при вводе правильного текста –

+0

@ Vincent: попробуйте обновленный ответ. Это также работает на 4.2 и решает вашу проблему. Спасибо хоть. – Rajkiran

4

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

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

Ох. Извините, что слышал от вас. Ваше решение работает? – Rajkiran

+0

Да. Потому что я столкнулся с той же проблемой, что и вы, и это было первое решение, с которым я столкнулся. Не стесняйтесь попробовать это. – van

+0

О, я обязательно пойду на это решение. Если это будет работать на всех версиях Android и удовлетворит 1-й номер ответа на мой ответ, я отвечу вместо вашего ответа. :) – Rajkiran

1

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

Я создал свой собственный класс 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.

7

Вам не нужно создавать новый класс 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); 

      } 
-2

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

Шаг 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

+2

Не могли бы вы снова прочитать название? Он говорит - EditText setError() со значком, но БЕЗ ПОПЕРСКОГО СООБЩЕНИЯ. – Rajkiran

0

Чтобы получить только-значок ошибки без сообщения об ошибке-всплывающее окно только тогда, когда 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, чтобы получить значок и всплывающее сообщение.

Смежные вопросы