自定义属性获取颜色返回无效值

我有一个自定义的视图,我想设置一个textview的颜色。

我有

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> 

我在布局文件中设置它

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

在我的代码中,我设置了它

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

但颜色不断返回-1。 我也试图设置颜色#000当我这样做,我得到的价值-16777216

我也尝试了a.getInteger和a.getInt

任何人遇到这个问题或build议?

解决scheme,谢谢Alex Fu

getColor无法处理引用

现在正在工作

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

Solutions Collecting From Web of "自定义属性获取颜色返回无效值"

您在示例中使用了对颜色的引用,但是根据您的attrs.xml文件,该属性必须是颜色types,而不是引用。 这可能是你使用hex颜色代码的原因,但是使用返回-1的引用。

如果将格式更改为引用,则还应该更改方法以从a.getColor()将其检索到a.getColorStateList()

这是一些与attrs的错误。

以下工作完美。


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

用法

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