我试图通过其构造函数为自定义视图设置样式。它没有达到预期的效果。
QueueButton.java
public class QueueButton extends ImageButton {
public QueueButton(Context context) {
super(context);
}
public QueueButton(Context context, AttributeSet attrs) {
super(context, attrs, R.style.queuebutton);
}
public QueueButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, R.style.queuebutton);
}
}
(布局中)
<QueueButton
android:id="@+id/queueBtn"
style="@style/queuebutton"
android:layout_width="50dp"
android:layout_height="35dp"
android:layout_gravity="center_horizontal"
android:focusable="false"
android:src="@drawable/remove_queue_icon" />
在下面的屏幕截图中,有三种不同的结果。
super(context, attrs)
。显然,这是错误的做法。我无法找到相关信息,说明原因以及如何获得适当的结果。
答案 0 :(得分:3)
我相信你需要直接传递一个属性而不是一个样式。
向attrs.xml文件添加属性(如果您还没有,则在values文件夹中创建一个属性)。 然后为您的应用创建主题,并将新属性链接到该主题中所需的样式(或者,如果您已经使用过该主题,则只需将其添加到现有主题)。 最后,在自定义视图中,构造函数将属性传递给超级构造函数。 Android将在上下文主题中查找该属性(根据文档),并应使用它。 请注意,但是如果在XMl中指定了样式,它将覆盖您在构造函数中使用的样式,因为它优先。
最终看起来应该如何:
attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="queueButtonStyle" format="reference" />
</resources>
styles.xml:
<style name="AppBaseTheme" parent="android:Theme.Holo.Light">
<item name="queueButtonStyle">@style/queuebutton</item>
</style>
<style name="queuebutton">
...content...
</style>
自定义视图类构造函数:
public class QueueButton extends ImageButton {
public QueueButton(Context context) {
super(context);
}
public QueueButton(Context context, AttributeSet attrs) {
super(context, attrs, R.attr.queueButtonStyle);
}
public QueueButton(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, R.attr.queueButtonStyle);
}
}