在自定义视图构造函数中覆盖样式

时间:2014-05-22 16:13:51

标签: android android-view android-styles

我试图通过其构造函数为自定义视图设置样式。它没有达到预期的效果。

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

在下面的屏幕截图中,有三种不同的结果。

  • 左:所描述的类的结果,但没有在XML中声明的样式。
  • 中:相同的XML,但在双参数构造函数中使用super(context, attrs)
  • 右:以XML格式声明样式的结果。这是理想的外观。

显然,这是错误的做法。我无法找到相关信息,说明原因以及如何获得适当的结果。

QueueButton results

1 个答案:

答案 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);
   }
}