我使用的是Android v21支持库。
我已经创建了一个自定义背景色的按钮。当我使用背景色时,材质设计效果如波纹,显示消失了(除了点击时的抬高)。
<Button
style="?android:attr/buttonStyleSmall"
android:background="?attr/colorPrimary"
android:textColor="@color/white"
android:textAllCaps="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Button1"
/>
下面是一个正常的按钮,效果很好。
<Button
style="?android:attr/buttonStyleSmall"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textAllCaps="true"
android:text="Button1"
/>
我来这篇文章寻找一种方法,有一个背景颜色的我的ListView项目,但保持波纹。
我简单地添加了我的颜色作为背景,selectableItemBackground作为前景:
<style name="my_list_item">
<item name="android:background">@color/white</item>
<item name="android:foreground">?attr/selectableItemBackground</item>
<item name="android:layout_height">@dimen/my_list_item_height</item>
</style>
它就像一个魔法。我想同样的技巧也可以用在按钮上。祝你好运。
使用AppCompat(22.1.1+),你可以添加这样的样式:
<style name="MyGreenButton">
<item name="colorButtonNormal">#009900</item>
</style>
并通过应用样式来使用它:
<android.support.v7.widget.AppCompatButton
style="@style/MyGreenButton"
android:layout_width="match_width"
android:layout_height="wrap_content"
android:text="A Green Button"
/>
通过编程改变颜色,我发现更新颜色的唯一方法(在API 15或16上)是使用“背景色调列表”。它不会删除API 21设备上漂亮的径向动画:
ColorStateList colorStateList = new ColorStateList(new int[][] {{0}}, new int[] {0xFF009900}); // 0xAARRGGBB
button.setSupportBackgroundTintList(colorStateList);
因为button. setbackground(…)和button. getbackground ().mutate(). setcolorfilter(…)在API 15和16中不会像在API 21中那样改变按钮的颜色。
我来这篇文章寻找一种方法,有一个背景颜色的我的ListView项目,但保持波纹。
我简单地添加了我的颜色作为背景,selectableItemBackground作为前景:
<style name="my_list_item">
<item name="android:background">@color/white</item>
<item name="android:foreground">?attr/selectableItemBackground</item>
<item name="android:layout_height">@dimen/my_list_item_height</item>
</style>
它就像一个魔法。我想同样的技巧也可以用在按钮上。祝你好运。
@ianhanniballake的回答是绝对正确和简单的。但我花了几天时间才明白。对于那些不理解他的回答的人,这里有更详细的实现
<Button
android:id="@+id/btn"
style="@style/MaterialButton"
... />
<style name="MaterialButton" parent="Widget.AppCompat.Button.Colored">
<item name="android:theme">@style/Theme.MaterialButton</item>
...
</style>
<style name="Theme.MaterialButton" parent="YourTheme">
<item name="colorAccent">@color/yourAccentColor</item>
<item name="colorButtonNormal">@color/yourButtonNormalColor</item>
</style>
= = = = = =
<Button
android:id="@+id/btn"
style="@style/Widget.AppCompat.Button.Colored"
android:theme="@style/Theme.MaterialButton" />
<style name="Theme.MaterialButton" parent="YourTheme">
<item name="colorAccent">@color/yourAccentColor</item>
<item name="colorButtonNormal">@color/yourButtonNormalColor</item>
</style>
还有另一个简单的解决方案,为“平面”按钮提供自定义背景,同时保持它们的“材质”效果。
将你的按钮放在ViewGroup中,并在那里设置所需的背景
设置当前主题的selectableItemBackground作为按钮的背景(API >=11)
例如:
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/blue">
<Button
style="?android:attr/buttonStyleSmall"
android:background="?android:attr/selectableItemBackground"
android:textColor="@android:color/white"
android:textAllCaps="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Button1"
/>
</FrameLayout>
可以用于平面按钮,它在API >=11上工作,你将在>=21设备上获得涟漪效应,保持常规按钮在pre-21上,直到AppCompat更新以支持涟漪。
你也可以只对>=21的按钮使用selectableItemBackgroundBorderless。