2014-12-26 8 views
6

Faccio applicazione materiale di design stileStyling AutoCompleteTextView con AppCompat.EditText non funziona

voglio cambiare AutoCompleteTextView stile
di stile come in android.support.v7.internal.widget.TintEditText

ho aggiunto al mio stile style.xml:

<style name="AppTheme" parent="AppTheme.Base"/> 
<style name="AppTheme.Base" parent="Theme.AppCompat"> 
    <item name="colorPrimary">@color/colorPrimary</item> 
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
    <item name="android:autoCompleteTextViewStyle">@style/AutoCompleteTextViewAppTheme</item> 
</style> 
<style name="AutoCompleteTextViewAppTheme" parent="Base.Widget.AppCompat.EditText"/> 

Questo funziona, ma i colori della linea non cambiano. enter image description here

EditTexts con design del materiale sembrano utilizzare colorControlActivated e colorControlNormal. Pertanto, ho provato a sovrascrivere queste proprietà nella definizione di stile precedente ma non ha alcun effetto.
Cosa devo fare per farlo funzionare?

risposta

5

tenta di aggiungere lo stile desiderato da utilizzare per il widget nella xml questo modo:

<View 
style="@style/NameOfYourTheme" 
... 
/> 

Se questo non dovesse funzionare si potrebbe provare per lo stile da soli. Dovrai modificare gli attributi TextView che puoi cercare here.

TextColor per un'istanza potrebbe essere cambiato modificando l'attributo android:textColor che dovrebbe essere aggiunto al vostro stile, per esempio:

<style name="AutoCompleteTextViewAppTheme" parent="Base.Widget.AppCompat.EditText"/> 

<item name="android:textColor">#ffffffff</item> 
</style> 

Se si desidera cambiare la linea EditText è necessario modificare l'attributo di sfondo, ad esempio in questo modo:

<item name ="android:background="@drawable/line_background"> </item> 

E aggiungere un nuovo file line_background.xml nei tuoi drawable cartella con un contenuto simile:

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


    <stroke 
     android:color="#c0c000" 
     android:width="3dp"></stroke> 
</shape> 
+0

attributo textColor funziona, ma il problema è che non posso cambiare i colori di linea (è nero sullo schermo) – CodeNinja

+0

Vedere le mie modifiche recenti –

+2

Questo appena traccia una linea nel mezzo. Non fa una sottolineatura materiale. – radley

3

Ho creato Tint Aware AutoCompleteTextView personalizzato per risolvere questo problema.

package com.atrinax.gist; 

import android.content.Context; 
import android.support.v7.internal.widget.TintTypedArray; 
import android.util.AttributeSet; 
import android.widget.AutoCompleteTextView; 

public class TintAutoComplete extends AutoCompleteTextView { 

private static final int[] TINT_ATTRS = { 
     android.R.attr.background 
}; 

public TintAutoComplete(Context context) { 
    this(context, null); 
} 

public TintAutoComplete(Context context, AttributeSet attrs) { 
    this(context, attrs, android.R.attr.editTextStyle); 
} 

public TintAutoComplete(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 

    TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs, TINT_ATTRS, 
      defStyleAttr, 0); 
    setBackgroundDrawable(a.getDrawable(0)); 
    a.recycle(); 
} 
} 

Aggiungi questa classe al tuo progetto. Usa in XML come questo:

<com.atrinax.gist.TintAutoComplete 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" /> 

aspetto negativo di questa soluzione è che si basa sulla classe interna

android.support.v7.internal.widget.TintTypedArray 

che potrebbero cambiare o essere disponibili in futuro. Si prega di dare un'occhiata alla risposta di Derek qui sotto - è risolvere un problema con uno sfondo che derivano dalla mia risposta.

+0

Questo non tiene conto dello sfondo a discesa su v21 che diventa trasparente. Dal mio test 4.4 e al di sotto del default sullo sfondo scuro. – Derek

+0

Sono a conoscenza di questo problema, ma non riesco a trovare una soluzione alternativa che imposti il ​​proprio layout per gli elementi di elenco o modificando la visualizzazione nell'adattatore, ad esempio: 'if (convertView == null) { convertView = getLayoutInflater(). inflate (android.R.layout.simple_list_item_1, null); convertView.findViewById (android.R.id.text1) .setBackgroundColor (backgroundLightColor); } –

+1

Ho trovato una soluzione a questo, vedere la mia risposta per maggiori informazioni. Grazie per aver condiviso questo snippet di codice, un approccio molto interessante. – Derek

2

estrapolare su @ risposta di Atrinax, ecco una classe che gestirà l'attributo popupBackground per estensione AutoCompleteTextView e l'aggiunta a TINT_ATTRS

public class TintAutoCompleteTextView extends AutoCompleteTextView { 

private static final int[] TINT_ATTRS = { 
     android.R.attr.background, 
     android.R.attr.popupBackground 
}; 

public TintAutoCompleteTextView(Context context) { 
    this(context, null); 
} 

public TintAutoCompleteTextView(Context context, AttributeSet attrs) { 
    this(context, attrs, android.R.attr.autoCompleteTextViewStyle); 
} 

public TintAutoCompleteTextView(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 

    TintTypedArray a = TintTypedArray.obtainStyledAttributes(context, attrs, TINT_ATTRS, 
      defStyleAttr, 0); 
    setBackgroundDrawable(a.getDrawable(0)); 
    setDropDownBackgroundDrawable(a.getDrawable(1)); 
    a.recycle(); 
} 
} 
Problemi correlati