使用 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
。这个特殊的布局充气器用<com.google.android.material.button.MaterialButton>
标记替换了通用的<Button>
标记,因此您可以从框架的按钮获得不同的行为。
【参考方案1】:
如果您想要一个真正的Button
,但您可以像框架Button
(而不是MaterialButton
)一样修改它,那么您可以在布局文件中明确指定框架版本。替换这个:
<Button android:id="@+id/item_popupwindows_cancel" ... />
用这个:
<android.widget.Button
android:id="@+id/item_popupwindows_cancel"
... />
这将为您提供它在锡上所说的内容:android.widget.Button
,它应该以您期望的方式响应样式。
同样,如果您想要支持库功能而不是材料组件功能,您可以使用<androidx.appcompat.widget.AppCompatButton>
。
【讨论】:
非常感谢,它对我有用。但我不知道为什么不能使用 ? 当您使用非命名空间标签时,例如<Button>
,LayoutInflater 将选择要膨胀的具体实现。由于您有一个 Theme.MaterialComponents
主题,因此 LayoutInflater 将尽可能选择为小部件的材质组件版本充气。换句话说,对于那个主题,<Button>
和<com.google.android.material.button.MaterialButton>
是相同的。但是您可以通过指定它来选择不同的实现,例如<androidx.appcompat.widget.AppCompatButton>
或<android.widget.Button>
。
@BenP.,是的。不仅是LinearLayout
,还有其他容器(ConstraintLayout、FrameLayout 等)。【参考方案2】:
在这种特殊情况下,持有第二个Button
的LinearLayout
似乎具有白色背景色。这意味着您无需为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有三种方式(不使用,动态使用,静态使用,默认是动态使用)