Использование пользовательского цвета для фона кнопки при использовании атрибута selectableItemBackground
Я пытаюсь использовать
android:background="?android:attr/selectableItemBackground"
чтобы заставить мою кнопку делать соответствующие эффекты для каждой версии Android, например, рябь и т.д.
Но это создает кнопку с серым цветом, когда мне нужен другой цвет.
Как я могу переопределить этот цвет по умолчанию?
Ответы
Ответ 1
Если вы прочитали исходный код 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 и создать пользовательскую кнопку с соответствующей функцией.
Примечание: my minsdk равно 14. Кроме того, эффект пульсации леденец работает просто отлично
Ответ 2
Просто переместите нужный цвет на внешний/родительский уровень, например. "@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>
Ответ 3
Используя этот метод, вы можете настроить цвет эффекта пульсации. Во-первых, вам нужно создать xml файл в вашем ресурсе, который вы хотите использовать. Создайте файл ripple_effect.xml и добавьте следующий код. Я использую цвет фона как красный.
Рез/вытяжка/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 выглядит следующим образом.
Рез/макет/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>
Теперь эффект пульсации Красный цвет.
Ответ 4
Вместо использования ?android:attr/selectableItemBackground
вы можете создать XML файл в папке drawable со следующим содержимым.
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:dither="true">
<item
android:state_pressed="true"
android:drawable="@color/orange"/>
<item
android:state_enabled="false"
android:drawable="@color/default"/>
<item
android:drawable="@color/default"/>
</selector>
Обновлено: btn_drawable.xml
вы сохраняете эти файлы как btn_drawable.xml
в папке btn_drawable.xml
.
Просто замените ?android:attr/selectableItemBackground
@drawable/btn_drawable.xml
Ответ 5
Изменить: теперь это возможно с помощью 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);
}