2013-07-17 13 views
17

Ich habe eine benutzerdefinierte Ansicht, in der ich die Farbe eines Textview festlegen möchte.Benutzerdefinierte Attr Get-Farbe gibt ungültige Werte

Ich habe

attrs.xml

<declare-styleable name="PropertyView"> 
    <attr name="propertyTitle" format="string" localization="suggested" /> 
    <attr name="showTitle" format="boolean" /> 
    <attr name="propertyTextColor" format="color" /> 
    <attr name="propertyTextSize" format="dimension" /> 
</declare-styleable> 

ich es in der Layout-Datei gesetzt

<com.something.views.PropertyView 
    android:id="@+id/dwf_rAwayTeamTimePenaltyInput" 
    style="@style/mw" 
    propertyview:propertyTextSize="16sp" 
    propertyview:propertyTitle="@string/AwayTeam" 
    propertyview:showTitle="true" 
    propertyview:propertyTextColor="@color/textLight" /> 

Und in meinem Code stelle ich es

TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.PropertyView, 0, 0); 

    showTitle = a.getBoolean(R.styleable.PropertyView_showTitle, false); 
    String title = a.getString(R.styleable.PropertyView_propertyTitle); 
    float textSize = a.getDimension(R.styleable.PropertyView_propertyTextSize, -1); 
    int color = a.getColor(R.styleable.PropertyView_propertyTextColor, -1); 
    textSize = textSize/getResources().getDisplayMetrics().scaledDensity; 
    if(BuildConfig.DEBUG) Log.e(getClass().getName(), "Color set to: " + color); 

    setShowTitle(showTitle); 
    setTitle(title); 
    if(textSize >= 0) mTitleTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, textSize); 
    if(color != -1) mTitleTextView.setTextColor(color); 

    a.recycle(); 

Aber Farbe kehrt immer -1 zurück. Ich habe auch versucht Farbe auf # 000 zu setzen, wenn ich tue, dass ich einen Wert von bekommen -16777216

I a.getInteger und a.getInt auch

Wer hat Erfahrung mit diesem Problem oder Anregungen versucht?

Lösung dank Alex Fu kann

getColor nicht Referenzen behandeln

Es arbeitet jetzt mit

ColorStateList color = a.getColorStateList(R.styleable.PropertyView_propertyTextColor); 
mTitleTextView.setTextColor(color); 

Antwort

16

Sie einen Verweis auf eine Farbe in Ihrem Beispiel verwenden, aber nach In Ihrer Datei attrs.xml muss diese Eigenschaft ein Farbtyp sein, keine Referenz. Dies ist wahrscheinlich der Grund, warum es bei Verwendung eines Hexadezimal-Farbcodes funktionierte, aber die Verwendung einer Referenz gab -1 zurück. Wenn Sie das Format in eine Referenz ändern, sollten Sie auch die Methode zum Abrufen von a.getColor() auf a.getColorStateList() ändern.

+0

Gute Idee, aber zu schade es nicht gelöst hat. –

+0

Haben Sie das Format in attrs.xml geändert? Wenn ja, haben Sie auch die 'a.getColor()' Methode geändert? Sie sollten stattdessen 'a.getColorStateList()' verwenden. 'getColorStateList' kann sowohl Volltonfarben als auch Referenzen verstehen. –

+0

Danke das war es =) blöd, dass getColor nicht mit einer Referenz umgehen kann, aber es hat wahrscheinlich einen guten Grund. –

2

Das ist eine Art Bug mit attrs.

Folgendes funktioniert perfekt.


attrs.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 

    <!-- Your View --> 
    <declare-styleable name="YourView"> 
     <attr name="tint_color" format="reference" /> <!-- Important --> 
     <attr name="ripple_drawable" format="reference" /> <!-- Important --> 
    </declare-styleable> 

</resources> 

YourView.java

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

public YourView(Context context, @Nullable AttributeSet attrs) { 
    this(context, attrs, 0); 
} 

public YourView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 

    // Get attrs 
    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.YourView, defStyleAttr, 0); 

    // Set tint 
    int tintStyle = R.styleable.YourView_tint_color; 
    if (a.hasValue(tintStyle)) { 
     mTintColor = a.getResourceId(tintStyle, 0); // Important 
     setTint(mTintColor); 
    } 

    // Set Ripple 
    int rippleStyle = R.styleable.YourView_ripple_drawable; 
    if (a.hasValue(rippleStyle)) { 
     mRippleDrawable = a.getResourceId(rippleStyle, 0); // Important 
     setRipple(mRippleDrawable); 
    } 

    // End 
    a.recycle(); 
} 

Nutzungs

<com.your.app.YourView 
    ... 
    app:ripple_drawable="@drawable/ripple_default" 
    app:tint_color="@color/colorWhite" /> 
Verwandte Themen