【发布时间】:2017-07-31 01:32:07
【问题描述】:
我希望创建一个自定义 ViewGroup 以在库中使用;其中包含一些 ImageButton 对象。我希望能够为每个ImageButton 应用一个样式;但我无法弄清楚如何以编程方式应用样式,除非将属性资源应用于defStyleAttr 参数;像这样:
mImageButton = new ImageButton(
getContext(), // context
null, // attrs
R.attr.customImageButtonStyle); // defStyleAttr
问题在于,更改每个ImageButton 样式的唯一方法是将样式应用于父主题中的此属性。但我希望能够设置默认样式,而不必为使用此库的每个项目手动设置此属性。
有一个参数完全符合我的要求; defStyleRes,可以这样使用:
mImageButton = new ImageButton(
getContext(), // context
null, // attrs
R.attr.customImageButtonStyle, // defStyleAttr
R.style.customImageButtonStyle); // defStyleRes
此参数仅适用于 API 级别 21 及以上,但我的项目针对 API 级别 16 及以上。那么如何设置defStyleRes,或者应用默认样式,而不访问这个参数呢?
按照@EugenPechanec 的建议,我使用ContextThemeWrapper 应用了我的样式,这似乎效果很好,但是每个ImageButton 现在都有默认的ImageButton 背景,即使我的样式应用了<item name="android:background">@null</item>。
这是我使用的样式:
<style name="Widget.Custom.Icon" parent="android:Widget">
<item name="android:background">@null</item>
<item name="android:minWidth">56dp</item>
<item name="android:minHeight">48dp</item>
<item name="android:tint">@color/selector_light</item>
</style>
这就是我的应用方式:
ContextThemeWrapper wrapper = new ContextThemeWrapper(getContext(), R.style.Widget_Custom_Icon);
mImageButton = new AppCompatImageButton(wrapper);
左边是我得到的,右边是我想要的样子:
【问题讨论】:
标签: android android-custom-view android-styles android-viewgroup android-api-levels