将自定义小部件样式添加到应用主题
Add custom widget styling to app theme
我已经实现了一个带有自定义属性的自定义视图,我正在尝试在主题中设置它的样式。我已按照 this answer 中的说明进行操作,但我的小部件未从应用主题中选取样式。
我的小部件的自定义属性:
<declare-styleable name="BarGraph">
<attr name="barColour" format="color"/>
<attr name="barWidth" format="dimension"/>
<attr name="maxBarHeight" format="dimension"/>
<attr name="barWhiteSpace" format="dimension"/>
</declare-styleable>
声明样式引用:
<declare-styleable name="CustomTheme">
<attr name="barGraphStyle" format="reference"/>
</declare-styleable>
设置我的小部件的样式:
<style name="AppTheme.BarGraphStyle" parent="AppTheme">
<item name="barColour">?attr/colorAccent</item>
<item name="barWidth">@dimen/bar_graph_bar_width</item>
<item name="maxBarHeight">@dimen/bar_graph_bar_max_height</item>
<item name="barWhiteSpace">@dimen/bar_white_space</item>
</style>
将样式添加到我的应用主题中:
<style name="AppTheme" parent="Theme.AppCompat.Light">
...
<item name="barGraphStyle">@style/AppTheme.BarGraphStyle</item>
</style>
最后,我在自定义组件的构造函数中获取了自定义属性:
TypedArray styledAttributes = context.obtainStyledAttributes(attrs, R.styleable.BarGraph);
ColorStateList barColour = styledAttributes.getColorStateList(R.styleable.BarGraph_barColour);
Log.d(TAG, "BarGraph: barColour = " + barColour);
float barWidth = styledAttributes.getDimension(R.styleable.BarGraph_barWidth, -1);
float maxHeight = styledAttributes.getDimension(R.styleable.BarGraph_maxBarHeight, -1);
float barWhiteSpace = styledAttributes
.getDimension(R.styleable.BarGraph_barWhiteSpace, -1);
styledAttributes.recycle();
Log.d(TAG, "BarGraph: barWidth = " + barWidth);
Log.d(TAG, "BarGraph: maxHeight = " + maxHeight);
Log.d(TAG, "BarGraph: barWhiteSpace = " + barWhiteSpace);
构造函数的日志输出:
D/BarGraph( 6862): BarGraph: barColour = null
D/BarGraph( 6862): BarGraph: barWidth = -1.0
D/BarGraph( 6862): BarGraph: maxHeight = -1.0
D/BarGraph( 6862): BarGraph: barWhiteSpace = -1.0
如果我使用 style="@style/AppTheme.BarGraphStyle"
将样式直接应用到我的小部件上,它的样式是正确的,所以我知道这不是样式本身的问题。
编辑: 我的构造函数:
public BarGraph(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public BarGraph(Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// grab all the custom styling values
TypedArray styledAttributes = context.obtainStyledAttributes(attrs, R.styleable.BarGraph);
ColorStateList barColour = styledAttributes.getColorStateList(R.styleable.BarGraph_barColour);
Log.d(TAG, "BarGraph: barColour = " + barColour);
float barWidth = styledAttributes.getDimension(R.styleable.BarGraph_barWidth, -1);
float maxHeight = styledAttributes.getDimension(R.styleable.BarGraph_maxBarHeight, -1);
float barWhiteSpace = styledAttributes .getDimension(R.styleable.BarGraph_barWhiteSpace, -1);
styledAttributes.recycle();
Log.d(TAG, "BarGraph: barWidth = " + barWidth);
Log.d(TAG, "BarGraph: maxHeight = " + maxHeight);
Log.d(TAG, "BarGraph: barWhiteSpace = " + barWhiteSpace);
// other non-styling code...
}
构造函数应该是这样的:
public BarGraph(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, R.attr.barGraphStyle);
}
public BarGraph(Context context, @Nullable AttributeSet attrs, @AttrRes int defStyle) {
super(context, attrs, defStyle);
// grab all the custom styling values
TypedArray styledAttributes = context.obtainStyledAttributes( attrs, R.styleable.BarGraph, defStyle, 0);
...
}
像这样更改你的第二个构造函数,
public BarGraph(Context context, AttributeSet attrs) {
this(context, attrs, R.attr.barGraphStyle);
}
在你的第三个构造函数中,使用这一行
TypedArray styledAttributes = context.obtainStyledAttributes(attrs, R.styleable.BarGraph, defStyleAttr, R.style.AppTheme_BarGraphStyle);
您错过了这些台词。这段代码对我来说效果很好。
我已经实现了一个带有自定义属性的自定义视图,我正在尝试在主题中设置它的样式。我已按照 this answer 中的说明进行操作,但我的小部件未从应用主题中选取样式。
我的小部件的自定义属性:
<declare-styleable name="BarGraph">
<attr name="barColour" format="color"/>
<attr name="barWidth" format="dimension"/>
<attr name="maxBarHeight" format="dimension"/>
<attr name="barWhiteSpace" format="dimension"/>
</declare-styleable>
声明样式引用:
<declare-styleable name="CustomTheme">
<attr name="barGraphStyle" format="reference"/>
</declare-styleable>
设置我的小部件的样式:
<style name="AppTheme.BarGraphStyle" parent="AppTheme">
<item name="barColour">?attr/colorAccent</item>
<item name="barWidth">@dimen/bar_graph_bar_width</item>
<item name="maxBarHeight">@dimen/bar_graph_bar_max_height</item>
<item name="barWhiteSpace">@dimen/bar_white_space</item>
</style>
将样式添加到我的应用主题中:
<style name="AppTheme" parent="Theme.AppCompat.Light">
...
<item name="barGraphStyle">@style/AppTheme.BarGraphStyle</item>
</style>
最后,我在自定义组件的构造函数中获取了自定义属性:
TypedArray styledAttributes = context.obtainStyledAttributes(attrs, R.styleable.BarGraph);
ColorStateList barColour = styledAttributes.getColorStateList(R.styleable.BarGraph_barColour);
Log.d(TAG, "BarGraph: barColour = " + barColour);
float barWidth = styledAttributes.getDimension(R.styleable.BarGraph_barWidth, -1);
float maxHeight = styledAttributes.getDimension(R.styleable.BarGraph_maxBarHeight, -1);
float barWhiteSpace = styledAttributes
.getDimension(R.styleable.BarGraph_barWhiteSpace, -1);
styledAttributes.recycle();
Log.d(TAG, "BarGraph: barWidth = " + barWidth);
Log.d(TAG, "BarGraph: maxHeight = " + maxHeight);
Log.d(TAG, "BarGraph: barWhiteSpace = " + barWhiteSpace);
构造函数的日志输出:
D/BarGraph( 6862): BarGraph: barColour = null
D/BarGraph( 6862): BarGraph: barWidth = -1.0
D/BarGraph( 6862): BarGraph: maxHeight = -1.0
D/BarGraph( 6862): BarGraph: barWhiteSpace = -1.0
如果我使用 style="@style/AppTheme.BarGraphStyle"
将样式直接应用到我的小部件上,它的样式是正确的,所以我知道这不是样式本身的问题。
编辑: 我的构造函数:
public BarGraph(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public BarGraph(Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// grab all the custom styling values
TypedArray styledAttributes = context.obtainStyledAttributes(attrs, R.styleable.BarGraph);
ColorStateList barColour = styledAttributes.getColorStateList(R.styleable.BarGraph_barColour);
Log.d(TAG, "BarGraph: barColour = " + barColour);
float barWidth = styledAttributes.getDimension(R.styleable.BarGraph_barWidth, -1);
float maxHeight = styledAttributes.getDimension(R.styleable.BarGraph_maxBarHeight, -1);
float barWhiteSpace = styledAttributes .getDimension(R.styleable.BarGraph_barWhiteSpace, -1);
styledAttributes.recycle();
Log.d(TAG, "BarGraph: barWidth = " + barWidth);
Log.d(TAG, "BarGraph: maxHeight = " + maxHeight);
Log.d(TAG, "BarGraph: barWhiteSpace = " + barWhiteSpace);
// other non-styling code...
}
构造函数应该是这样的:
public BarGraph(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, R.attr.barGraphStyle);
}
public BarGraph(Context context, @Nullable AttributeSet attrs, @AttrRes int defStyle) {
super(context, attrs, defStyle);
// grab all the custom styling values
TypedArray styledAttributes = context.obtainStyledAttributes( attrs, R.styleable.BarGraph, defStyle, 0);
...
}
像这样更改你的第二个构造函数,
public BarGraph(Context context, AttributeSet attrs) {
this(context, attrs, R.attr.barGraphStyle);
}
在你的第三个构造函数中,使用这一行
TypedArray styledAttributes = context.obtainStyledAttributes(attrs, R.styleable.BarGraph, defStyleAttr, R.style.AppTheme_BarGraphStyle);
您错过了这些台词。这段代码对我来说效果很好。