Nic*_*Goy 7 android kotlin material-design
我想以MaterialButton编程方式创建一个并TextButton在其上使用样式。
我尝试了以下操作,但生成的按钮具有背景颜色,而不是TextButton.
val newContext = ContextThemeWrapper(this, R.style.Widget_MaterialComponents_Button_TextButton)
val errorBtn = MaterialButton(newContext, null, R.style.Widget_MaterialComponents_Button_TextButton)
Run Code Online (Sandbox Code Playgroud)
我尝试了很多变体(不使用 3 参数构造函数或不使用上下文包装器)。
我发现了这个问题:Apply Style to MaterialButtonprogrammatically
但答案并不令人满意,因为设置背景色调不会产生良好的效果(按钮有阴影)。
阅读材料设计源代码后,我发现了以下内容。第三个参数MaterialButton不是样式资源而是样式属性。参数叫defStyleAttr和不defStyleRes,只有第二个相当于传入styleXML文件。并且MaterialButton不要实现采用 this 的 4 个参数构造函数。
澄清一下,样式资源是“独立”样式定义,样式属性是上下文样式中属性的名称。您应该使用一个属性来设置整个小部件的样式,这有点奇怪,但这就是它的工作原理。
这意味着,我们必须创建引用整个小部件样式的属性,并在创建按钮时传递它。
为此,我们必须:
attr.app 资源中创建资源。<attr name="myAttr" format="reference"/>styles.xmlstyles.xml,修改应用程序主题以使用该属性,如下所示:<style name="AppTheme" parent="Theme.MaterialComponents.NoActionBar">
<item name="myAttr">@style/Widget.MaterialComponents.Button.TextButton</item>
</style>
Run Code Online (Sandbox Code Playgroud)
val errorBtn = MaterialButton(this, null, R.attr.myAttr)
Run Code Online (Sandbox Code Playgroud)
this仅当(当前上下文,通常是一个活动)已AppTheme应用于它时(通常应该是这种情况),这才有效。如果不是这种情况,或者如果您想更改主题,可以使用 来应用它ContextThemeWrapper,如下所示:
val ctx = ContextThemeWrapper(this, R.style.AppTheme)
val errorBtn = MaterialButton(ctx, null, R.attr.myAttr)
Run Code Online (Sandbox Code Playgroud)