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

  • Le style d'édition personnalisé n'indique pas le clavier sur la mise au point
  • Dessiner une disposition carrée dans un cercle
  • Pourquoi étendre ImageView marqué comme une erreur?
  • Créer une mise en page de chatView dans Android
  • Utilisation d'une référence de tableau comme un attribut XML pour une vue Android personnalisée
  • Deux barres d'action (en bas et en haut) en même temps?
  • Android "élévation" ne présente pas d'ombre sous une vue personnalisée
  • Dois-je appeler back.onDraw () dans une vue personnalisée?
  • 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.