How to remove border/shadow from lollipop buttons

2019-01-21 10:41发布

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>

10条回答
我只想做你的唯一
2楼-- · 2019-01-21 11:06

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

查看更多
对你真心纯属浪费
3楼-- · 2019-01-21 11:14

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"
查看更多
祖国的老花朵
4楼-- · 2019-01-21 11:16

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>
    
查看更多
Root(大扎)
5楼-- · 2019-01-21 11:21

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

查看更多
你好瞎i
6楼-- · 2019-01-21 11:26

in xml we can use

android:stateListAnimator="@null"
查看更多
smile是对你的礼貌
7楼-- · 2019-01-21 11:26

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

button.stateListAnimator = null
查看更多
登录 后发表回答