我正在尝试基于android.widget.Button
创建自己的按钮。但是,当我以编程方式设置样式属性时,我会遇到这个渲染问题:
无法在当前主题中找到样式的'my_button'
但是,XML中的设置样式是有效的。
屏幕截图
我错过了什么吗?
activity_main.xml
<com.myapp.Components.Button
android:id="@+id/xx"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="touch_"
app:_icon=""/>
<com.myapp.Components.Button
style="@style/My_Button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="touch"
app:_icon=""/>
button.java
public class Button extends android.widget.Button {
public Button(@NonNull Context context) {
super(context, null, R.style.My_Button);
init(context, null);
}
public Button(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs, R.style.My_Button);
init(context, attrs);
}
public Button(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {
super(context, attrs, R.style.My_Button);
init(context, attrs);
}
// ... more
}
style.xml
<style name="My_Button" parent="Base.Widget.AppCompat.Button.Borderless">
<item name="android:foreground">?android:attr/selectableItemBackground</item>
<item name="android:background">#592612</item>
<item name="android:gravity">center</item>
</style>
最后,我找到了答案!
替换:
super(context, attrs, R.style.My_Button);
with super(context, attrs, R.attr.ButtonStyle);
在 styles.xml 添加
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="ButtonStyle">@style/Button_Style</item>
...
</style>
in attr.xml add
<declare-styleable name="Theme">
<attr name="ButtonStyle" format="reference"/>
</declare-styleable>