我创建了一个带有按钮的布局,该按钮默认显示为灰色背景色
<Button ... />
但是如果我创建自定义按钮类,
<com.project.MyButton ... />
以前为灰色的背景变为透明。
public class MyButton extends AppCompatButton {
private static final String TAG = MyButton.class.getSimpleName();
public MyButton(Context context) {
this(context, null);
}
public MyButton(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
}
不知道为什么。
答案 0 :(得分:2)
没有布局XML很难说,但是我认为这是对伸缩构造函数的一种反对。与其直接呼叫this(context, attrs, 0)
等,不如直接呼叫super
。可能发生的情况是您没有选择默认的按钮样式。您的MyButton
应该如下所示:
MyButton.java
public class MyButton extends AppCompatButton {
private static final String TAG = MyButton.class.getSimpleName();
public MyButton(Context context) {
super(context);
}
public MyButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
}
看看AppCompatButton.java
中的两个构造函数:
public AppCompatButton(Context context, AttributeSet attrs) {
this(context, attrs, attr.buttonStyle);
}
public AppCompatButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(TintContextWrapper.wrap(context), attrs, defStyleAttr);
...other stuff...
}
构造函数AppCompatButton(Context context, AttributeSet attrs)
包含defStyleAttr
中的attr.buttonStyle
。调用super(context,attrs)
时,您将获得此样式。当您伸缩构造函数时,实际上是调用AppCompatButton(context, attrs, 0)
并错过了默认样式的贡献。