2013-01-02 8 views
30

Quello che voglio fare è cambiare il colore di sfondo (impostabile dall'utente) di un messaggio di errore visualizzato dopo aver usato il metodo setError().Cambia lo sfondo del messaggio di errore di EditText

Attualmente, sembra che questo:

enter image description here

Ho scoperto che Android ha due file:

  • popup_inline_error.9.png
  • popup_inline_above_error.9.png

E' dovrebbe essere in grado per impostare utilizzando due attributi:

  • errorMessageBackground
  • errorMessageAboveBackground

Ma quando provo a metterli in mio tema, tutto quello che ottiene è:

<item name="errorMessageBackground">@drawable/popup_inline_error_holo_light</item> 
<item name="errorMessageAboveBackground">@drawable/popup_inline_error_above_holo_light</item> 

error: Error: No resource found that matches the given name: attr 'errorMessageBackground'. 

(è il stesso with android:errorMessageBackground)

Sto mettendo questo q qui, perché sono a corto di idee - forse qualcuno è già riuscito a farlo?

EDIT: intestazione del tema che sto utilizzando:

<resources xmlns:android="http://schemas.android.com/apk/res/android"> 
    <style 
     name="Theme.MyThemeName" 
     parent="@style/Theme.Sherlock.Light"> 

ALTRO EDIT: Uh, ho scoperto che la mia domanda è un duplicato di: android:errorMessageBackground getting no resource found error in styles.xml

ANCORA UN ALTRO MODIFICO: Questo è un problema noto, dai un'occhiata a questo link: https://code.google.com/p/android/issues/detail?id=55879

+1

Hai dato un'occhiata a [questa domanda] (http://stackoverflow.com/questions/6745577/which-theme-attribute-changes-the-text-color-of-an-edittexts-error-message)? – Eric

+0

L'ho fatto, in realtà - ma voglio cambiare il colore della bolla, non il colore del testo (che sono in grado di modificare). Ho notato che Chris è riuscito a cambiare lo sfondo - non ho idea di come. – scana

+0

Sembra che 'errorMessageBackground' sia un nuovo attributo introdotto nel livello API Android 19. Hai provato a mettere il tuo stile nella cartella' values-v19'? –

risposta

0
private EditText adTitle; 
// .... 
adTitle.setError(Html.fromHtml("<font color='red'>hello</font>")); 
+0

Quello che voglio è cambiare lo sfondo di EditText, non il colore del carattere stesso - si prega di leggere attentamente la domanda prima di rispondere. – scana

+1

E 'stato davvero utile per me ... !!! Grazie..!!! –

+16

Questo non risponde alla domanda. – Garcon

-2

È possibile utilizzare questo metodo solo passare il testo msg, il vostro EditText id

public static void setErrorMsg(String msg,EditText viewId) 
{ 
    //Osama ibrahim 10/5/2013 
    int ecolor = Color.WHITE; // whatever color you want 
    String estring = msg; 
    ForegroundColorSpan fgcspan = new ForegroundColorSpan(ecolor); 
    SpannableStringBuilder ssbuilder = new SpannableStringBuilder(estring); 
    ssbuilder.setSpan(fgcspan, 0, estring.length(), 0); 
    viewId.setError(ssbuilder); 

} 
+3

Scusa, non è quello che volevo: dovevo cambiare tutto lo sfondo, per far sembrare lo stesso messaggio di errore di ICS. – scana

5

è necessario includere queste dipendenze:

compile 'com.android.support:appcompat-v7:23.1.1' 
compile 'com.android.support:design:23.1.1' 

e qui è un esempio su come usalo:

<android.support.design.widget.TextInputLayout 
     android:id="@+id/input_layout_password" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 

     <EditText 
      android:id="@+id/input_password" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:hint="@string/hint_email" /> 

</android.support.design.widget.TextInputLayout> 

Questo ti darà il Material Design che stai cercando per dare la convalida del modulo e un buon effetto di animazione per l'etichetta.

enter image description here

4

Vorrei suggerire di usare @Codeversed solution, ma se non va bene per voi per qualche motivo riesco a utilizzare l'implementazione personalizzata EditText.

rappresentazione EditText usuale: enter image description here

EditText con l'errore: enter image description here

In poche parole: ho creato Stato XML personalizzato per la visualizzazione degli errori. Vedere codice relativo seguito:

InputEditText.java:

import android.annotation.TargetApi; 
import android.content.Context; 
import android.graphics.drawable.Drawable; 
import android.os.Build; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.util.AttributeSet; 
import android.widget.EditText; 

import com.example.oleksandr.inputedittext.R; 

/** 
* Input EditText which allows define custom drawable for error state 
*/ 
public class InputEditText extends EditText { 

    private static final int[] STATE_ERROR = {R.attr.state_error}; 

    private boolean mIsError = false; 

    public InputEditText(Context context) { 
     this(context, null, 0); 
     init(); 
    } 

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

    public InputEditText(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(); 
    } 

    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    public InputEditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
     init(); 
    } 

    private void init() { 
     addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
       // empty 
      } 

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

      @Override 
      public void afterTextChanged(Editable s) { 
       // empty 
      } 
     }); 
    } 

    @Override 
    public void setError(CharSequence error) { 
     mIsError = error != null; 
     super.setError(error); 
     refreshDrawableState(); 
    } 

    @Override 
    public void setError(CharSequence error, Drawable icon) { 
     mIsError = error != null; 
     super.setError(error, icon); 
     refreshDrawableState(); 
    } 

    @Override 
    protected int[] onCreateDrawableState(int extraSpace) { 
     final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); 
     if (mIsError) { 
      mergeDrawableStates(drawableState, STATE_ERROR); 
     } 
     return drawableState; 
    } 
} 

drawable/edittext_bg_error.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape 
    android:id="@+id/listview_background_shape" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    > 
    <stroke 
     android:width="2dp" 
     android:color="#f00" 
     /> 
    <padding 
     android:bottom="2dp" 
     android:left="2dp" 
     android:right="2dp" 
     android:top="2dp" 
     /> 
    <corners android:radius="5dp"/> 
    <solid android:color="#ffffffff"/> 
</shape> 

drawable/edittext_bg_selector.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 

    <!-- custom error state drawable --> 
    <item android:drawable="@drawable/edittext_bg_error" app:state_error="true"/> 

    <!-- Do whatever you want for all other states --> 
    <item android:drawable="@android:drawable/editbox_background_normal"/> 
</selector> 

aggiungere al vostro attrs.xml

<attr name="errorColor" format="reference"/> 

e styleables.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <declare-styleable name="error"> 
     <attr name="state_error" format="boolean"/> 
    </declare-styleable> 
</resources> 

e il loro utilizzo è davvero semplice:

<com.example.oleksandr.inputedittext.views.InputEditText 
    android:id="@id/edittext" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/edittext_bg_selector" 
    android:inputType="text" 
    android:text="@string/hello_world" 
    /> 

[EDIT]:

Appena realizzato, la risposta originale riguardava la modifica del colore del popup di errore, ma non il colore di sfondo di EditText. Ad ogni modo, spero che questo possa aiutare qualcuno.

+1

stavo cercando qualcosa come questo approccio. Grazie –