无法使用android:新材质组件中的按钮背景

qvsjd97n  于 2023-02-06  发布在  Android
关注(0)|答案(9)|浏览(181)

我在android x上使用了新材质组件com.google.android.material:material,但我无法为按钮设置自定义背景。
我知道可以使用app:backgroundTint来更改颜色
但是默认的背景有一些我想去掉的填充,还有使用android:background设置我自己的背景的老方法但是这已经不起作用了。
我查看了docs,但找不到任何提及此变更的内容。

holgip5t

holgip5t1#

在材质零部件库中,MaterialButton具有默认样式insetBottom和默认样式insetTop,默认样式值为6dp
您可以使用以下命令更改它:

<com.google.android.material.button.MaterialButton
      android:insetTop="0dp"
      android:insetBottom="0dp"
      ../>

如果你想改变背景色,你可以使用app:backgroundTint属性,或者你可以覆盖默认样式中的一些主题属性,然后你可以使用新的**materialThemeOverlay**属性。
在您的情况下,可以执行以下操作:

<style name="MtButtonStyle"
 parent="Widget.MaterialComponents.Button">
   <item name=“materialThemeOverlay”>@style/GreenButtonThemeOverlay</item>
</style>

<style name="GreenButtonThemeOverlay">
  <item name="colorPrimary">@color/green</item>
</style>

最后,从版本**1.2.0-alpha06开始,您可以在MaterialButton中使用android:background**属性。

<MaterialButton
    app:backgroundTint="@null"
    android:background="@drawable/button_drawable"
    ... />
u4dcyp6a

u4dcyp6a2#

The documentation for the MaterialButton class表示:
不要使用android:background属性。MaterialButton管理其自己的可绘制背景,设置新背景意味着MaterialButton无法再保证其引入的新属性将正常工作。如果更改默认背景,MaterialButton无法保证良好定义的行为。
但是,the GitHub readme表示:
注:MaterialButton在视觉上与ButtonAppCompatButton不同,其中一个主要区别是AppCompatButton在左右两侧都有4dp插图,而MaterialButton没有。
这里只提到了左/右inset,但是自述文件的Attributes部分显示支持所有四个inset:

因此,您可以将这些属性添加到<MaterialButton>标记中:

android:insetTop="0dp"
android:insetBottom="0dp"
v09wglhw

v09wglhw3#

查看https://medium.com/@velmm/material-button-in-android-e4391a243b17,我发现app:backgroundTint(和app:backgroundTintMode)可以工作,它改变了一种颜色,但不是一个可绘制的选择器。
Also您可以将<Button替换为<android.widget.Button

dw1jzc5e

dw1jzc5e4#

如果你想使用渐变可绘制作为MaterialButton的背景,
将您的MaterialButton设置如下:

<com.google.android.material.button.MaterialButton
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_margin="16dp"
     app:backgroundTint="@null"
     android:background="@drawable/group_47"
     app:layout_constraintEnd_toEndOf="@+id/input_password"
     app:layout_constraintStart_toStartOf="@+id/input_password"
     app:layout_constraintTop_toBottomOf="@+id/input_password" />
aij0ehis

aij0ehis5#

如果您希望保留您的

android:background="@drawable/button_background"

并让MaterialButton尊重它,则必须设置

app:backgroundTint="@null"
app:backgroundTintMode="add" // it doesn't matter the value, but it must be set

请注意,您也可以使用app:background代替,尽管我已经注意到足够多的突破性变化,我仍然喜欢上面的方法。

yshpjwxd

yshpjwxd6#

当我在一个按钮中使用状态可绘制时,我面临同样的问题,但它不改变按钮的背景。经过长时间的搜索,我找到了2个解决方案如下:
第一个解决方案是在values/themes.xml文件中将应用程序主题从MaterialComponents更改为AppCompat。然后状态可绘制将正常工作。

<style name="Theme.MyApplication" parent="Theme.AppCompat.DayNight.DarkActionBar">

如果您仍然希望使用MaterialComponents主题,则可以尝试第二种解决方案。
使用〈android.widget.按钮代替〈按钮或〈com.google.android.材料.按钮.材料按钮

<android.widget.Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/state_test"
        android:text="Button" />

我在这里找到的第二个解决方案

ki1q1bka

ki1q1bka7#

google设计团队之所以决定将android:background="@drawable/"功能排除在材料库的初始版本之外,主要是为了让开发者能够更快地为应用程序构建一致且专业的设计,这是因为大多数像我这样的开发者在应用程序的设计和颜色方面做得很糟糕。
另外,我在迁移到MDC时从google tutorial中找到了这个代码片段。

bbmckpt7

bbmckpt78#

只需使用android:backgroundTint

<style name="MyButtonStyle" parent="Widget.MaterialComponents.Button">
    <item name="android:backgroundTint">@color/pink</item>
</style>

<com.google.android.material.button.MaterialButton
    android:id="@+id/followButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="@dimen/channel_header_item_margin"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@id/titeChannelTV"
    style="@style/MyButtonStyle"/>
yi0zb3m4

yi0zb3m49#

使用简单的

app:backgroundTint="@null"

与按钮属性完美地工作。

相关问题