Tengo un botón en mi actividad y me gustaría que tuviera el color de acento de mi tema. En lugar de hacer mis propios dibujables como teníamos que hacer antes de Lollipop, naturalmente me gustaría usar el nuevo backgroundTint
atributo.
<Button
android:id="@+id/btnAddCode"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:backgroundTint="@color/accent"
android:text="@string/addressInfo_edit_addCode" />
Desafortunadamente, no tiene ningún efecto, el botón permanece gris.
Probé diferentes valores para backgroundTintMode
, que no cambiaron nada.
También intenté hacerlo programáticamente en mi Actividad, lo que no cambió nada.
addCodeView.findViewById(R.id.btnAddCode).setBackgroundTintList(
getResources().getColorStateList(R.color.accent));
¿Por qué se ignora mi tinte?
EDITAR: Solo para aclarar, de hecho estoy probando en un dispositivo Lollipop. Otros widgets (por ejemplo, EditText) se tiñen de forma correcta y automática.
Respuestas:
Probado en API 19 a API 27
<?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.AppCompatButton xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" style="@style/Widget.AppCompat.Button.Colored" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/retry" android:textColor="@android:color/white" app:backgroundTint="@android:color/holo_red_dark" />
produce salida como -
fuente
Las malas noticias
Como dice BoD, no tiene sentido teñir los antecedentes de un Button en Lollipop 5.0 (API nivel 21).
Las buenas noticias
Lollipop 5.1 (API nivel 22) parece haber solucionado este problema cambiando btn_mtrl_default_shape.xml (entre otros archivos): https://android.googlesource.com/platform/frameworks/base/+/6dfa60f33ca6018959ebff1efde82db7d2aed1e3%5E!/#
La gran noticia
La nueva biblioteca de soporte (versión 22.1+) agrega soporte de tintado compatible con versiones anteriores a muchos componentes, incluido AppCompatButton .
Desafortunadamente, la
android:backgroundTint
propiedad aún no funciona (tal vez estoy haciendo algo mal), por lo que debe configurar elColorStateList
código in, usandosetSupportBackgroundTintList()
. Sería muy bueno ver elandroid:backgroundTint
apoyo en el futuro. Actualización : ¡Marcio Granzotto comentó queapp:backgroundTint
funciona en AppCompatButton! Tenga en cuenta que no lo esapp:
,android:
porque está en la aplicación / biblioteca.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" > <AppCompatButton android:id="@+id/mybutton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Testing, testing" app:backgroundTint="#ff00ff"/> </LinearLayout>
Su actividad se inflará automáticamente en
AppCompatButton
lugar de lo normalButton
si deja que heredeAppCompatActivity
.public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); AppCompatButton v = (AppCompatButton) findViewById(R.id.mybutton); ColorStateList csl = new ColorStateList(new int[][]{new int[0]}, new int[]{0xffffcc00}); v.setSupportBackgroundTintList(csl); } }
Por supuesto, debería obtener el
ColorStateList
de un recurso de color, pero yo era un vago, así que ...Ah, y no olvides basar el tema de tu aplicación en uno de los
Theme.AppCompat
temas, o las vistas compatibles serán muy, muy tristes ...;)Esto funcionó tanto en 2.3.7 (Gingerbread MR1) como en 5.0 (Lollipop 'Classic').
fuente
colorButtonNormal
con AppCompat 22.1.1 (configurando el tema solo para los botones), me funciona en 4.4.4 y 5.1.new ColorStateList(new int[][]{new int[0]}, new int[]{0xffffcc00});
hacerlo, puede escribir de forma más concisaColorStateList.valueOf(0xffffcc00);
.Parece que teñir un dibujo ondulado no tiene sentido (y el fondo predeterminado de un botón es un dibujo ondulado).
De hecho, después de mirar el botón de dibujo predeterminado de la plataforma, encontré la forma "correcta" de hacer esto :. Tienes que definir esto en tu tema:
<item name="android:colorButtonNormal">@color/accent</item>
(Por supuesto, esto es solo para nivel 21+).
Advertencia: dado que esto está definido en un tema, usará el color dado para todos los botones (al menos todos los botones en las actividades que usan ese tema).
Como beneficio adicional, también puede cambiar el color de la ondulación definiendo esto:
<item name="android:colorControlHighlight">@color/accent_ripple</item>
fuente
colorControlHighlight
Sin embargo, cambiaría muchos otros widgets. Me alegro de que lo hayas resuelto.Para resolver problemas relacionados con el teñido en Android 5.0.x, uso algo como esto:
public static void setButtonTint(Button button, ColorStateList tint) { if (Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP && button instanceof AppCompatButton) { ((AppCompatButton) button).setSupportBackgroundTintList(tint); } else { ViewCompat.setBackgroundTintList(button, tint); } }
Utiliza el método de soporte solo para API 21 y ViewCompat para todos los demás casos.
fuente
if (view instanceof TintableBackgroundView) { ((TintableBackgroundView) view).setSupportBackgroundTintList(tint); } else { ViewCompat.setBackgroundTintList(view, tint); }
Normalmente lo hago dinámicamente usando PorterDuff:
Puede consultar diferentes modos de fusión aquí y buenos ejemplos aquí .
fuente
Solo use en
app:backgroundTint
lugar deandroid:backgroundTint
, el tinte tendrá efecto debajo de Lollipop. El motivo es elAppCompatActivity
usoAppCompatViewInflater
para cambiar automáticamente Button o TextView a AppCompatButton o AppCompatTextView, y luegoapp:backgroundTint
surte efecto.En mi proyecto lo usé, funcionó.
fuente
Creo que necesitas ponerte
android:background
aandroid:backgroundTint
trabajar.Para ser más precisos, supongo que no se puede utilizar
backgroundTint
el fondo del botón predeterminado de los temas de Material, que se define comoRippleDrawable
.fuente
Se informó un problema similar en google https://code.google.com/p/android/issues/detail?id=201873
Pero después del lanzamiento de la biblioteca de soporte de Android, revisión 23.2.1 (marzo de 2016), este error se solucionó.
Problema: FloatingActionButton.setBackgroundTintList (tinte @Nullable ColorStateList) ya no cambia el color de fondo
actualizar la biblioteca de soporte a
Android Support Library to 23.2.1
Utilice la biblioteca de soporte de diseño (23.2.1) y appcompatwidgets como se muestra a continuación
Diseño de materiales para dispositivos de pre-piruleta :
Biblioteca de compatibilidad de Android 22.1 :
fuente
Simplemente use la aplicación: backgroundTint en lugar de android: backgroundTint
fuente
Si miramos en el código fuente de la biblioteca de soporte, vemos que se tiñe normalmente son botones conocidos, pero si cambiamos la forma de nuestro botón (tengo un botón redondo), el tinte no funciona bien en api <= 21. También podemos ver que TintManager se convirtió en una clase pública (appcompat-v7: 23.1.1), por lo que podemos tomar ColorStateList de la forma del botón predeterminado (que está teñido correctamente en 5.0) para el tema actual (por lo que no tenemos que crear la matriz de colores):
Context c = ...; // activity AppCompatButton ab = ...; // your button // works ok in 22+: if (Build.VERSION.SDK_INT <= 21) { // default appcompat button, that is tinted ok with current theme colors "abc_btn_default_mtrl_shape": // ColorStateList tint = TintManager.get(c).getTintList(R.drawable.abc_btn_default_mtrl_shape); // Appcompat 23.2 change: ColorStateList tint = AppCompatDrawableManager.get().getTintList(c, R.drawable.abc_btn_default_mtrl_shape); ab.setSupportBackgroundTintList(tint); }
fuente
Porque el atributo
backgroundTint
solo se usa en el nivel de API 21 y superiorfuente
Tenga en cuenta que la biblioteca más actualizada de Recyclerview también puede causar este error.
Este comando
sendBtnView.setBackgroundTintList(colorState)
funcionó perfectamente en el pasado pero dejó de funcionar para mí. después de la investigación, resulta que la causa es la biblioteca que se agregó a las dependencias de gradle:
compile 'com.android.support:recyclerview-v7:+'
Así que intenté cambiarlo a 23.02.1 como se recomendó aquí en la publicación de Amit Vaghela. Me cambié a
compile 'com.android.support:recyclerview-v7:23.02.1'
Pero el error de Gradle dijo que la biblioteca Recyclerview no tiene esta versión (23.02.1) (Gradle no pudo encontrarla en Jcenter raw.github o repositorio)
Luego, porque sabía que el comando setBackgroundTintList solía funcionar bien en el pasado con la versión 22.02.0 'en todas las otras bibliotecas que tengo en las dependencias de gradle. así que lo cambio a:
compile 'com.android.support:recyclerview-v7:22.02.0'
Y ahora vuelve a funcionar.
fuente
No estoy seguro de si se recomienda esto, pero puede probar esto:
Drawable newDrawable = mBtnAction.getBackground(); // obtain Bg drawable from the button as a new drawable DrawableCompat.setTint(newDrawable, mActivity.getHomeTobBarBGColor()); //set it's tint mBtnAction.setBackground(newDrawable); //apply back to button
En un sentido general, funciona. Intenté,
ViewCompat
pero no parece funcionar correctamente.fuente
puedes usar
backgroundTint
<android.support.design.button.MaterialButton
con la"com.android.support:design:28.0.0-rc01"
versiónfuente
Si está utilizando androidx, agregue la versión con prefijo y no con prefijo resuelto el problema en Android 5.1:
<style name="Button_Primary"> <item name="android:layout_height">wrap_content</item> <item name="android:layout_width">wrap_content</item> <item name="android:backgroundTint">@color/button_primary_selector</item> <item name="backgroundTint">@color/button_primary_selector</item><!--needed for android 5--> </style>
El selector button_primary está en la
color
carpeta con el siguiente contenido:<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:local="http://schemas.android.com/apk/res-auto"> <item android:state_enabled="true" android:color="@android:color/holo_blue_dark" /> <item android:state_enabled="false" android:color="@android:color/darker_gray" /> </selector>
y aplicarlo en el botón regular en
AppCompatActivity
<Button style="@style/Button_Primary"/>
fuente