如何以自定义样式以编程方式创建/初始化Button?

And*_*ord 2 user-interface android styles button

我试图以编程方式创建一些按钮将它们添加到现有的ViewGroup.这工作正常,但我无法使用正确的样式初始化按钮.

我知道,创建后无法设置/更改视图样式.但到目前为止我发现的所有解决方案都说,使用自定义样式创建视图应该没问题(从我认为的API级别11开始,我使用的是14+):

Button button = new Button (getActivity(), null, R.style.MyButtonStyle);
Run Code Online (Sandbox Code Playgroud)

唯一的效果是,按钮创建时没有任何样式.没有背景,所以选择器,没有边距/填充只是纯文本.我认为MyButtonStyle会被破坏,但是使用MyButtonStyle在XML中创建按钮没问题.

为什么这不起作用?

And*_*ord 7

我终于找到了解决方案!问题是,为什么以下不起作用:

Button button = new Button (getActivity(), null, R.style.MyButtonStyle);
Run Code Online (Sandbox Code Playgroud)

原来,问题是,R.style.xxx正在使用而不是R.attr.xxx.这似乎是这个contstructor 的实现或者至少在这个contstructor的文档中的一个错误View(Context context, AttributeSet attrs, int defStyleAttr):第三个参数必须是R.attr才能使构造函数正常工作并正确应用样式.

因此,为了使构造函数工作,必须添加更多代码/res/values/attr.xml/res/values/styles.xml:

<!-- /res/values/attr.xml -->
<declare-styleable name="AppTheme">
    <attr name="specialButtonStyle" format="reference"/>
</declare-styleable>


<!-- /res/values/styles.xml -->
<style name="AppTheme" parent="AppBaseTheme">
    ...
    <item name="specialButtonStyle">@style/MyButtonStyle</item>
</style>

<style name="MyButtonStyle" parent="@android:style/Widget.Button">
    ...
</style>


// In Java we can now use R.attr.specialButtonStyle instead of R.style.MyButtonStyle
// getActivity() is used because I am working in a Fragment. Within an
// Activity this can be used instead...
Button button = new Button(getActivity(), null, R.attr.specialButtonStyle);
Run Code Online (Sandbox Code Playgroud)

令人讨厌的是,文档尚未针对此问题进行更新.有关此问题的第一个错误报告已于2011年提交...

此外,还必须编写一些额外的代码才能使这个解决方案运行得更快,并且(从我的角度来看)比通常提出的扩展XML布局要好得多.