今天看Android开发艺术探索,按照书中所说自己写一个CircleView,带有自定义属性circle_color,怎么都达不到自定义设置圆颜色的效果,最后发现书中CircleView的三个构造函数有问题
获得自定义的颜色值逻辑是在第三个构造函数里**public CircleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr)**写的,但是实际上在xml里设置app:circle_color值时,调用的是第二个构造函数 public CircleView(Context context, @Nullable AttributeSet attrs)
所以第二个构造函数必须显示调用第三个构造函数。
具体分析为:
Code中实例化一个View会调用第一个构造函数,在xml中定义会调用第二个构造函数,而第三个函数系统是不调用的,要显式调用,如下面:
```go
public class CircleView extends View {
private int mColor = Color.RED;
private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
public CircleView(Context context) {
this(context, null);
}
public CircleView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public CircleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleView);
mColor = a.getColor(R.styleable.CircleView_circle_color, Color.YELLOW);
a.recycle();
init();
}
private void init() {
mPaint.setColor(mColor);
}
......
第三个构造函数里,第三个参数的意义是默认的Style,只是这里没有说清楚,这里的默认的Style是指它在当前Application或Activity所用的Theme中的默认Style,以系统中的TextView为例说明。
public TextView(Context context) {
this(context, null);
}
public TextView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, com.android.internal.R.attr.textViewStyle);
}
public TextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0);
}
而R.attr.textViewStyle其实是Widget.TextView.ListSeparator style
@style/Widget.TextView.ListSeparator
而Widget.TextView.ListSeparator style定义在framework的style.xml文件中:
<style name="Widget.TextView.ListSeparator">
<item name="background">@drawable/dark_header_dither</item>
<item name="layout_width">match_parent</item>
<item name="layout_height">wrap_content</item>
<item name="textStyle">bold</item>
<item name="textColor">?textColorSecondary</item>
<item name="textSize">14sp</item>
<item name="gravity">center_vertical</item>
<item name="paddingStart">8dip</item>
</style>