在使用selectableItemBackground属性时使用自定义颜色作为按钮背景

时间:2014-12-11 03:48:22

标签: android android-layout

我正在尝试使用

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

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

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

如何覆盖此默认颜色?

6 个答案:

答案 0 :(得分:10)

如果您阅读source code of 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类并使用相关功能制作自定义Button,那会好得多。

注意:我的minsdk也是14.也是,棒棒糖涟漪效果很好

答案 1 :(得分:3)

只需在外部/父级别移动您想要的颜色,例如“@ color / Red”是按钮颜色:

    <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>

答案 2 :(得分:2)

使用此方法,您可以自定义涟漪效果颜色。首先,您必须在drawable资源目录中创建一个xml文件。创建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>

现在,涟漪效应是红色。

答案 3 :(得分:0)

如果要通过编程方式进行操作:

goal
   name bonus commission discretionary.bonus
1  John  6000       2500                   0
2 Marie     0       2000                   0
3  Alex     0          0                2500

答案 4 :(得分:-2)

而不是使用?android:attr / selectableItemBackground,你可以使用以下内容在drawable文件夹中创建一个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*

答案 5 :(得分:-2)

修改:现在可以使用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);
    }