it-roy-ru.com

Как удалить границу/тень от кнопок Lollipop

Кнопки выглядят хорошо для api <21. Однако версии +21 создают эту границу или тень, как показано на рисунке ниже. Как мне избавиться от этого, не меняя тему дыры, а устанавливая переменную стиля?

enter image description here

Это может быть более четким на этом цветном изображении. Вокруг кнопок есть какая-то граница .enter image description here

Мой стиль кнопок определяется следующим образом:

<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>
37
7heViking

У Lollipop есть небольшая неприятная особенность под названием stateListAnimator, которая обрабатывает возвышения на кнопках, что приводит к теням.

Удалите переменную stateListAnimator, чтобы избавиться от теней.

У вас есть несколько вариантов сделать это:

Джава:

button.setStateListAnimator(null);

Котлин:

button.stateListAnimator = null

или в вашем макете XML:

<Button
...
Android:stateListAnimator="@null" 
....
/> 
157
daemmie

Лучший и самый простой способ, которым я пользуюсь, это установка атрибута стиля на кнопку 

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

может быть кому-то понадобится в будущем.

32
WonderSoftwares

Уже есть стиль, который вы можете использовать, чтобы не иметь границ.

применять 

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

на ваш предмет, чтобы убрать границы

6
Olivier Mercier

Я исправил это глобально , установив Android:stateListAnimator="@null" в 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>

И вуаля тени ушли навсегда :)

6
Korayem

Добавлен эффект "тени" на тема Lollipop Appcompat

добавьте следующую строку в res/values-v21/styles.xml, чтобы удалить тень по умолчанию

Уровень темы:

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

XML-макет:

Android:stateListAnimator="@null"

Джава:

setStateListAnimator(null);

Котлин:

stateListAnimator = null
3
John Ruban Singh

Результат

  1. Начиная с Android v21, Border был добавлен по умолчанию для всех кнопок.

    <!-- 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>
    
    • Свойство " stateListAnimator " является тем, которое вызывает проблему.

Решение

  1. В нашей теме приложения установите стиль кнопки, чтобы удалить границу по умолчанию (сама библиотека поддержки Android предоставляет стиль для нее).

    <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>
    
1
Vasanth

Я бы посоветовал вам полностью удалить тень, установив высоту на ноль. Поскольку у вас уже есть стиль XML (добавьте его для универсального использования), или вы можете добавить этот атрибут в определение представления XML

Android:elevation="0dp"
1
Booger

Кнопки в Android имеют свойство statelistAnimator, поэтому, объявив его пустым, мы можем удалить границу кнопки

Android:stateListAnimator="@null"
0
virendra singh deora

Если вы хотите сделать это программно в Kotlin, вы можете сделать

button.stateListAnimator = null
0
Nari Kim Shin

в XML мы можем использовать

Android:stateListAnimator="@null"
0
Ankit Tomer