2014-12-26 11 views
6

I-Material-Design-Stil AnwendungStyling AutoCompleteTextView mit AppCompat.EditText funktioniert nicht

mache ich wie AutoCompleteTextView Stil
zu Stil ändern möchten in android.support.v7.internal.widget.TintEditText

Ich habe Stil meiner 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"/> 

Das funktioniert, aber die Linienfarben ändern sich nicht.

EditTexts mit Material Design scheinen colorControlActivated und colorControlNormal zu verwenden. Daher habe ich versucht, diese Eigenschaften in der vorherigen Stildefinition zu überschreiben, aber es hat keine Auswirkungen.
Was muss ich tun, damit es funktioniert?

Antwort

5

Versuchen Sie, den gewünschten Stil hinzuzufügen für das Widget in der xml auf diese Weise zu verwenden:

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

Wenn das Sie versuchen, nicht funktionieren könnte, es selbst zu stylen. Sie müssen die TextView-Attribute ändern, die Sie nachschlagen können here.

Textfarbe für eine Instanz durch Änderung des android:textColor Attribut geändert werden könnten, die zu Ihrem Stil hinzugefügt werden soll, zum Beispiel:

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

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

Wenn Sie die EditText Linie Sie die Hintergrund Attribut ändern müssen geändert werden soll, zum Beispiel auf diese Weise:

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

und eine neue Datei line_background.xml in Ihrem Drawables Ordner mit einem ähnlichen Inhalt hinzufügen:

<?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

textcolor Attribut funktioniert behandeln, aber Problem ist, dass ich nicht Linienfarben ändern kann (es ist schwarz auf dem Bildschirm) – CodeNinja

+0

Siehe meine letzten Änderungen –

+2

Das zeichnet nur eine Linie durch die Mitte. Es wird kein Material unterstrichen. – radley

3

Ich habe benutzerdefinierte Tint Aware AutoCompleteTextView erstellt, um dieses Problem zu lösen.

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

diese Klasse zu einem Projekt hinzufügen. Verwendung in XML wie folgt aus:

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

Nachteil dieser Lösung ist, dass sie auf interne Klasse

android.support.v7.internal.widget.TintTypedArray 

beruht, die in der Zukunft nicht verfügbar ändern oder werden könnten. Bitte werfen Sie einen Blick auf Dereks Antwort unten - es löst ein Problem mit einem Hintergrund, der aus meiner Antwort entsteht.

+0

zugewiesen. Dies berücksichtigt nicht den Dropdown-Hintergrund auf v21 Das wird transparent. Von meinen Tests 4.4 und darunter ist standardmäßig der dunkle Hintergrund. – Derek

+0

Ich bin mir dieses Problems bewusst, aber ich kann keine andere Problemumgehung finden als das Festlegen eines eigenen Layouts für Listenelemente oder das Ändern der Ansicht im Adapter, zum Beispiel: 'if (convertView == null) { convertView = getLayoutInflater(). inflate (android.R.layout.simple_list_item_1, null); convertView.findViewById (android.R.id.text1) .setBackgroundColor (backgroundLightColor); } ' –

+1

Ich habe eine Lösung gefunden, siehe meine Antwort für weitere Informationen. Vielen Dank für die Freigabe dieses Code-Snippets, sehr cooler Ansatz. – Derek

2

Um auf @ Atrinax Antwort extrapolieren, hier ist eine Klasse, die das popupBackground Attribut von AutoCompleteTextView Erweitern und Hinzufügen zu 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(); 
} 
} 
Verwandte Themen