AppCompatButton子类具有透明背景

时间:2018-12-07 08:16:52

标签: android android-layout android-custom-view

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

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

不知道为什么。

1 个答案:

答案 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)并错过了默认样式的贡献。