Custom attr get color returns invalid values

J'ai une vue personnalisée dans laquelle je veux définir la couleur d'une vision de texte.

j'ai

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> 

Je l'ai configuré dans le fichier de mise en page

 <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" /> 

Et dans mon code, je l'ai mis

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

Mais la couleur continue de revenir -1. J'ai également essayé de définir la couleur à # 000 Lorsque je fais cela, j'ai une valeur de -16777216

J'ai également essayé a.getInteger et a.getInt

Quelqu'un connait-il ce problème ou ces suggestions?

Solution, grâce à Alex Fu

GetColor ne peut pas gérer les références

Il fonctionne maintenant avec

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

  • Obtenir une largeur de panneau de notification Android
  • Comment personnaliser la mise en page de snackBar?
  • Appel sur la méthode OnDraw () d'une vue personnalisée dans Android
  • Comment obtenir un énoncé qui est créé dans attrs.xml dans le code
  • Aucun identifiant de ressource trouvé pour l'attribut '' dans le package 'com.app ...'
  • Comment faire référence à un contrôle d'un autre pendant l'inflation?
  • L'invalidation d'une vue personnalisée provoque toutes les vues personnalisées dans un groupe de vues à invalider?
  • Le menu Android Circle Like Catch Notes
  • 2 Solutions collect form web for “Custom attr get color returns invalid values”

    Vous utilisez une référence à une couleur dans votre exemple, mais selon votre fichier attrs.xml, cette propriété doit être de type couleur, pas une référence. C'est probablement la raison pour laquelle, lorsque vous avez utilisé un code de couleur hexadécimal, cela a fonctionné, mais en utilisant une référence renvoyée -1.

    Si vous modifiez le format à une référence, vous devez également modifier la méthode pour l'extraire d' a.getColor() vers a.getColorStateList() .

    C'est une sorte de bogue avec les attrs .

    Ce qui suit fonctionne parfaitement.


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

    Usage

     <com.your.app.YourView ... app:ripple_drawable="@drawable/ripple_default" app:tint_color="@color/colorWhite" /> 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.