I find changing button color is one of the most difficult things to do right in Android when I first started programming for Android 2.2 (API Level 8)
. Thankfully, things are slightly better now.
android:background
Don't use android:background, as it will replace the entire Drawable thus removing click effect (e.g. material ripple effect) and remove changing of color state when pressed.
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/white"
/>
android:theme
Some suggested create a color theme, but I find it too troublesome and not flexible.
Edit res/values/styles.xml
to create a button theme with specific color.
<style name="Button.White" parent="ThemeOverlay.AppCompat">
<item name="colorAccent">@android:color/white</item>
</style>
Apply android:theme
to your button.
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:theme="@style/Button.White"
/>
backgroundTint
My personal favourite is backgroundTint.
If you are targetting API Level 21 and higher, you can use android:backgroundTint
.
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:backgroundTint="@android:color/white"
/>
For API Level 7 and higher, you should use app:backgroundTint
.
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:backgroundTint="@android:color/white"
/>
</android.support.constraint.ConstraintLayout>
If you need to set the button backgroundTint
programatically.
ViewCompat.setBackgroundTintList(button, ContextCompat.getColorStateList(this, android.R.color.white))
To handle color state when button is disabled, refer to Android Button Disabled Color Not Working After Color Change.