gpt4 book ai didi

android - 如何以编程方式创建/初始化具有自定义样式的按钮?

转载 作者:太空狗 更新时间:2023-10-29 16:03:18 30 4
gpt4 key购买 nike

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

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

Button button = new Button (getActivity(), null, R.style.MyButtonStyle);

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

为什么这不起作用?

最佳答案

我终于找到了解决办法!问题是,为什么以下内容不起作用:

Button button = new Button (getActivity(), null, R.style.MyButtonStyle);

原来,问题是,R.style.xxx 被用来代替 R.attr.xxx。好像这是一个bugView(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);

很烦人,关于这个问题的文档还没有更新。关于此问题的第一份错误报告是在 2011 年提交的...

还必须编写一些额外的代码才能运行此解决方案比通常建议的膨胀 XML 布局要快得多,而且(从我的角度来看)要好得多。

关于android - 如何以编程方式创建/初始化具有自定义样式的按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24262442/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com