Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 自定义视图构造函数中的重写样式_Android_Android View_Android Styles - Fatal编程技术网

Android 自定义视图构造函数中的重写样式

Android 自定义视图构造函数中的重写样式,android,android-view,android-styles,Android,Android View,Android Styles,我试图通过自定义视图的构造函数设置其样式。它没有预期的效果 QueueButton.java (布局图中) 在下面的屏幕截图中,有三种不同的结果 左:类的结果,如所述,但没有XML中声明的样式 中间:相同的XML,但在双参数构造函数中使用super(context,attrs) 右:在XML中声明样式的结果。这是理想的外观 显然,这是错误的做法。我未能找到相关信息,说明原因以及如何取得适当的结果 我认为您需要传入属性,而不是直接传入样式 将属性添加到attrs.xml文件中(如果您还没有

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

QueueButton.java

(布局图中)


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

  • 左:类的结果,如所述,但没有XML中声明的样式
  • 中间:相同的XML,但在双参数构造函数中使用
    super(context,attrs)
  • 右:在XML中声明样式的结果。这是理想的外观
显然,这是错误的做法。我未能找到相关信息,说明原因以及如何取得适当的结果


我认为您需要传入属性,而不是直接传入样式

将属性添加到attrs.xml文件中(如果您还没有属性,则在values文件夹中创建一个属性)。 然后为你的应用程序创建一个主题,并将新属性链接到该主题中所需的样式(或者,如果你已经在使用一个主题,就将其添加到现有主题中)。 最后,在自定义视图中,构造函数将属性传递给超级构造函数。Android将在上下文的主题中查找该属性(根据文档),并且应该使用它。 但是,请注意,如果在XMl中指定了样式,它将覆盖构造函数中使用的样式,因为它具有优先权

事情最终应该是这样的:

attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="queueButtonStyle" format="reference" />
</resources>
<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 version="1.0" encoding="utf-8"?>
<resources>
    <attr name="queueButtonStyle" format="reference" />
</resources>
 <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);
   }
}