在使用selectableItemBackground属性时使用button背景的自定义颜色

我正在尝试使用

android:background="?android:attr/selectableItemBackground"

让我的button为每个Android版本做适当的效果,如涟漪等

但是当我需要不同的颜色时,这会产生一个灰色的button。

我怎样才能覆盖这个默认的颜色?

如果你阅读了Button.java的源代码,那么你将会看到它是TextView.java的一个子类 。 我已经为有问题的问题做了一个简单的解决方法。

 <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:clickable="true" android:background="#1f5050"> <TextView android:layout_width="some_dp" android:layout_height="some_dp" android:id="@+id/button" android:background="?android:selectableItemBackground" /> </LinearLayout> 

在代码中:

 button.setOnClickLisetener(new Onclicklistener() { // do your stuff here } 

如果有人可以扩展TextView类并使用有问题的function制作自定义button,那将会好得多。

注意:我的minsdk是14.还有,棒棒糖的涟漪效应工作得很好

只需在外部/父级别移动所需的颜色,例如“@ color / Red”是button颜色:

  <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/Red" android:layout_weight="1"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?attr/selectableItemBackground" android:gravity="center" android:text="Hello" android:textColor="@color/White"/> </LinearLayout> 

使用这种方法,您可以自定义波纹效果颜色。 首先,你必须在你的drawable资源目录中创build一个xml文件。 创build一个ripple_effect.xml文件并添加以下代码。 我使用红色的背景颜色。

RES /抽拉/ ripple_effect.xml

 <?xml version="1.0" encoding="utf-8"?> <ripple xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:color="#af0c0e" tools:targetApi="lollipop"> <item android:id="@android:id/mask"> <shape android:shape="rectangle"> <solid android:color="#af0c0e" /> </shape> </item> </ripple> 

并为以上可绘制资源文件设置背景。 xml布局活动的最终代码如下所示。 RES /布局/ ripple_animation.xml

 <?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView android:layout_width="match_parent" android:layout_height="wrap_content" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_marginLeft="6dp" android:layout_marginRight="6dp" android:layout_marginBottom="8dp" android:layout_marginTop="8dp" android:paddingBottom="30dp" app:cardBackgroundColor="#e7e7e7" android:id="@+id/cardview" xmlns:android="http://schemas.android.com/apk/res/android"> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" android:background="@drawable/ripple_effect"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:layout_marginRight="16dp" android:layout_marginLeft="16dp" android:paddingBottom="5dp"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Pending" android:layout_weight="1" android:layout_marginBottom="2dp" android:textSize="25dp" android:textColor="#d11010" android:id="@+id/txtpending" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Assigned to:" android:layout_marginLeft="20dp" android:textColor="#ff000000" android:id="@+id/txtassigned" android:layout_weight="1"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="5dp" android:paddingTop="5dp" android:layout_marginLeft="16dp"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="Student Name" android:id="@+id/txtstudentname"/> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="Student Number" android:id="@+id/txtstudentnumber"/> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="Parent Name" android:id="@+id/txtparentname"/> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="Parent Number" android:id="@+id/txtparentnumber"/> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="Transfer Status" android:id="@+id/txttransfer"/> </LinearLayout> </LinearLayout> </LinearLayout> </android.support.v7.widget.CardView> 

现在,涟漪效应是红色的。

而不是使用?android:attr / selectableItemBackground,你可以在下面的内容中创build一个可绘制的xml文件夹。

 <item android:state_pressed="true" android:drawable="@color/orange"/> <item android:state_enabled="false" android:drawable="@color/default"/> <item android:drawable="@color/default"/> </selector> Updated: so you save this files as : btn_drawable.xml in drawable folder. Simply replace ?android:attr/selectableItemBackground with *@drawable/btn_drawable.xml* 

编辑 :现在可以使用AppCompat和backgroundTint

  android:backgroundTint="@color/yourColor" 

先前的解决

我有同样的问题,并最终以编程方式做到这一点:

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { ColorStateList colors = new ColorStateList(new int[][]{ new int[]{android.R.attr.state_enabled}, }, new int[]{pressed}); GradientDrawable item = new GradientDrawable(); item.setCornerRadius(radius); item.setColor(normal); RippleDrawable ripple = new RippleDrawable(colors, item, null); button.setBackgroundDrawable(ripple); } else { StateListDrawable stateListDrawable = new StateListDrawable(); GradientDrawable item; item = new GradientDrawable(); item.setCornerRadius(radius); item.setColor(pressed); stateListDrawable.addState(new int[]{android.R.attr.state_enabled, android.R.attr.state_pressed}, item); item = new GradientDrawable(); item.setCornerRadius(radius); item.setColor(normal); stateListDrawable.addState(new int[]{android.R.attr.state_enabled}, item); button.setBackgroundDrawable(stateListDrawable); }