How to remove border/shadow from lollipop buttons

AndroidButtonAndroid 5.0-Lollipop

Android Problem Overview


The buttons looks fine for api < 21. However, the +21 versions creates this border or shadow that is shown on the image below. How do I get rid of it without changeing the hole theme, but setting a style variable?

enter image description here

It might be more clear on this colored image. There is some kind of border around the buttons. enter image description here

My buttonssstyle is defined like this:

<style name="buttonTransparent" parent="Base.TextAppearance.AppCompat.Button">
        <item name="android:background">#00000000</item>
        <item name="android:textColor">@drawable/button_text_blue</item>
        <item name="android:textSize">18dp</item>
        <item name="android:textAllCaps">false</item>
        <item name="android:minHeight">45dp</item>
    </style>

<style name="buttonLargeWhite" parent="buttonTransparent">
        <item name="android:background">#FFF</item>
        <item name="android:layout_marginTop">10dp</item>
    </style>

Android Solutions


Solution 1 - Android

Lollipop has a nasty little feature called stateListAnimator which handles the elevations on Buttons, which leads to shadows.

Remove the stateListAnimator to get rid of the shadows.

You have got multiple options to do that:

Java:

button.setStateListAnimator(null);

Kotlin:

button.stateListAnimator = null

or in your layout xml's:

<Button
...
android:stateListAnimator="@null" 
....
/> 

Solution 2 - Android

Best and easiest way i am using is setting style attribute to Button

<Button
...
style="?android:attr/borderlessButtonStyle"
....
/> 

may be someone need in future.

Solution 3 - Android

There is already a style you can leverage not to have the borders.

apply

style="@style/Base.Widget.AppCompat.Button.Borderless" 

to your item to remove the borders

Solution 4 - Android

"shadow" effect is added on Lollipop Appcompat theme

add the following line in res/values-v21/styles.xml to remove default shadow

Theme level:

<item name="android:buttonStyle">@style/Widget.AppCompat.Button.Borderless</item>

xml layout:

android:stateListAnimator="@null"

Java:

setStateListAnimator(null);

Kotlin:

stateListAnimator = null

Solution 5 - Android

I fixed this globally by setting android:stateListAnimator="@null" in Resources\values\styles.xml:

<?xml version="1.0" encoding="UTF-8"?>
<resources>
	<style name="AppTheme" parent="AppTheme.Base">
	</style>
	<style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
		<item name="android:buttonStyle">@style/NoShadowButton</item>
	</style>
	<style name="NoShadowButton" parent="android:style/Widget.Button">
		<item name="android:stateListAnimator">@null</item>
	</style>
</resources>

And voila the shadows are gone for good :)

Solution 6 - Android

Buttons in android have statelistAnimator property so by declaring it null we can remove the border of button

android:stateListAnimator="@null"

Solution 7 - Android

in xml we can use

android:stateListAnimator="@null"

Solution 8 - Android

I would suggest you just remove the shadow entirely, by setting the elevation to nothing. Since you already have a XML style (add this to use this universally), or you could add this attribute to your XML view definition

android:elevation="0dp"

Solution 9 - Android

Issue

  1. From Android v21, Border has been added by default for all the button.

    <!-- Bordered ink button -->
    <style name="Widget.Material.Button">
         <item name="background">@drawable/btn_default_material</item>
         <item name="textAppearance">?attr/textAppearanceButton</item>
         <item name="minHeight">48dip</item>
         <item name="minWidth">88dip</item>
         <item name="stateListAnimator">@anim/button_state_list_anim_material</item>
         <item name="focusable">true</item>
         <item name="clickable">true</item>
         <item name="gravity">center_vertical|center_horizontal</item>
    </style>
    
  • The property "stateListAnimator" is the one which is causing the problem.

Solution

  1. In our application theme, set button style to remove the default border (Android support library itself provides style for it).

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
         <!-- From Android-v21 - Border has been added by default, hence we are removing it. -->
         <item name="android:buttonStyle">@style/Widget.AppCompat.Button.Borderless</item>
    </style>
    

Solution 10 - Android

If you want to do this programmatically in Kotlin, you can do

button.stateListAnimator = null

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Question7heVikingView Question on Stackoverflow
Solution 1 - AndroiddaemmieView Answer on Stackoverflow
Solution 2 - AndroidWonderSoftwaresView Answer on Stackoverflow
Solution 3 - AndroidOlivier MercierView Answer on Stackoverflow
Solution 4 - AndroidJohn Ruban SinghView Answer on Stackoverflow
Solution 5 - AndroidKorayemView Answer on Stackoverflow
Solution 6 - Androidvirendra singh deoraView Answer on Stackoverflow
Solution 7 - AndroidAnkit TomerView Answer on Stackoverflow
Solution 8 - AndroidBoogerView Answer on Stackoverflow
Solution 9 - AndroidVasanthView Answer on Stackoverflow
Solution 10 - AndroidNari Kim ShinView Answer on Stackoverflow