使用 Theme.MaterialComponents.Light.NoActionBar 样式时,设置 Button Background 无效

Posted

技术标签:

【中文标题】使用 Theme.MaterialComponents.Light.NoActionBar 样式时,设置 Button Background 无效【英文标题】:When using Theme.MaterialComponents.Light.NoActionBar style, setting Button Background has no effect 【发布时间】:2019-03-15 12:57:57 【问题描述】:

为了使用Chip和ChipGroup,我设置了Application style extends Theme.MaterialComponents.Light.NoActionBar int manifests.xml,然后设置了Button "android:background" attr,但是没有效果!为什么?我该怎么办?

这是我的风格:

  <style name="AppBaseTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="colorPrimary">@color/primary_material_light</item>
    <item name="colorPrimaryDark">@color/header_color</item>
    <item name="actionBarSize">48dp</item>
    <item name="android:screenOrientation">portrait</item>
    <!--<item name="buttonStyle">@style/AntButton</item>-->
    <!--<item name="materialButtonStyle">@style/AntButton</item>-->
    <!--<item name="android:button"></item>-->
    <!--<item name="android:progressTint">@color/ffc000</item>-->
    <item name="colorAccent">@color/ffc000</item>
</style>


<style name="AntButton" parent="android:Widget">
    <item name="android:background">@drawable/abc_btn_default_mtrl_shape</item>
    <item name="android:textAppearance">?android:attr/textAppearanceButton</item>
    <item name="android:minHeight">48dip</item>
    <item name="android:minWidth">88dip</item>
    <item name="android:focusable">true</item>
    <item name="android:clickable">true</item>
    <item name="android:gravity">center_vertical|center_horizontal</item>
    <!--<item name="android:colorButtonNormal">@color/white</item>-->
</style>

我已经尝试改变buttonStyle和materialButtonStyle,但也没有效果!

这是我的布局 XML:

<LinearLayout
    android:layout_
    android:layout_>

    <LinearLayout
        android:id="@+id/ll_popup"
        android:layout_
        android:layout_
        android:layout_gravity="bottom"
        android:background="@color/white"
        android:divider="@drawable/shape_divider_05dp"
        android:orientation="vertical"
        android:showDividers="beginning|middle">

        <!--only can use backgroundTint to change background color-->
        <Button
            android:id="@+id/item_popupwindows_Photo"
            android:layout_
            android:layout_
            android:backgroundTint="@color/white"
            android:text="Pictrue"
            android:textColor="@color/c_666666"
            android:textSize="16sp" />

        <!--background not effect !!-->
        <Button
            android:id="@+id/item_popupwindows_cancel"
            android:layout_
            android:layout_
            android:background="@color/white"
            android:text="cancel"
            android:textColor="@color/c_666666"
            android:textSize="16sp" />
    </LinearLayout>
</LinearLayout>

这是结果:

因为我在APP中使用过Chip和ChipGroup,所以我必须将用户主题扩展MaterialComponents!你知道怎么解决吗?请告诉我,谢谢!

在这个页面Can't use android:background with button from the new material components,作者想改变默认填充,但我想改变backgroundDrawable,所以,它对我不起作用。

【问题讨论】:

Can't use android:background with button from the new material components的可能重复 要了解的重要一点是,使用该主题会更改用于扩展布局的LayoutInflater。这个特殊的布局充气器用&lt;com.google.android.material.button.MaterialButton&gt; 标记替换了通用的&lt;Button&gt; 标记,因此您可以从框架的按钮获得不同的行为。 【参考方案1】:

如果您想要一个真正的Button,但您可以像框架Button(而不是MaterialButton)一样修改它,那么您可以在布局文件中明确指定框架版本。替换这个:

<Button
    android:id="@+id/item_popupwindows_cancel"
    ... />

用这个:

<android.widget.Button
    android:id="@+id/item_popupwindows_cancel"
    ... />

这将为您提供它在锡上所说的内容:android.widget.Button,它应该以您期望的方式响应样式。

同样,如果您想要支持库功能而不是材料组件功能,您可以使用&lt;androidx.appcompat.widget.AppCompatButton&gt;

【讨论】:

非常感谢,它对我有用。但我不知道为什么不能使用 当您使用非命名空间标签时,例如&lt;Button&gt;,LayoutInflater 将选择要膨胀的具体实现。由于您有一个 Theme.MaterialComponents 主题,因此 LayoutInflater 将尽可能选择为小部件的材质组件版本充气。换句话说,对于那个主题,&lt;Button&gt;&lt;com.google.android.material.button.MaterialButton&gt; 是相同的。但是您可以通过指定它来选择不同的实现,例如&lt;androidx.appcompat.widget.AppCompatButton&gt;&lt;android.widget.Button&gt; @BenP.,是的。不仅是LinearLayout,还有其他容器(ConstraintLayout、FrameLayout 等)。【参考方案2】:

在这种特殊情况下,持有第二个ButtonLinearLayout 似乎具有白色背景色。这意味着您无需为Button 明确指定白色背景;你可以让LinearLayout的背景显示出来。

这可以通过使用the "Text Button" style 的MaterialButton 来完成:

style="@style/Widget.MaterialComponents.Button.TextButton"

【讨论】:

谢谢,我想改变按钮背景可绘制,而不仅仅是改变背景颜色。当我使用 TextButton 样式时,也无法更改背景可绘制对象,只能将默认背景颜色更改为透明。现在我不得不使用 TextView 而不是 Button,这是一个临时解决方案。如果你有其他的味精,请告诉我,谢谢。【参考方案3】:

使用此代码更改颜色

app:backgroundTint="@color/primaryColor"

【讨论】:

【参考方案4】:

您也可以使用 ImageButton 代替 Material 组件中的 Button。 android:background 正在处理 ImageButton。

<ImageButton
    android:id="@+id/item_popupwindows_cancel"
    ... />

【讨论】:

以上是关于使用 Theme.MaterialComponents.Light.NoActionBar 样式时,设置 Button Background 无效的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)