AppCompatButton 子类具有透明背景

AppCompatButton subclass has transparent background

我创建了一个带有默认灰色背景颜色按钮的布局,

<Button ... />

但是如果我创建自定义按钮 class,

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

不知道为什么。

很难说没有你的布局 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) 合并了 defStyleAttrattr.buttonStyle。当你调用super(context,attrs)时,你会得到这个样式。当您伸缩构造函数时,您实际上调用了 AppCompatButton(context, attrs, 0) 并错过了默认样式的贡献。