Die Schaltflächen sehen für API <21 gut aus. Die +21-Versionen erstellen jedoch diesen Rand oder Schatten, der im Bild unten angezeigt wird. Wie entferne ich es, ohne das gesamte Lochdesign zu ändern, aber eine Stilvariable festzulegen?
Dieses farbige Bild könnte klarer sein. Es gibt eine Art Rahmen um die Knöpfe.
Mein Knopfstil ist folgendermaßen definiert:
<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>
Lollipop hat eine unangenehme kleine Funktion namens stateListAnimator
, die die Höhen auf Schaltflächen verarbeitet und zu Schatten führt.
Entfernen Sie das stateListAnimator
, um die Schatten zu beseitigen.
Sie haben mehrere Möglichkeiten, dies zu tun:
Java:
button.setStateListAnimator(null);
Kotlin:
button.stateListAnimator = null
oder in Ihren Layout-XMLs:
<Button
...
Android:stateListAnimator="@null"
....
/>
Die beste und einfachste Methode, die ich verwende, ist das Einstellen des Stilattributs auf Button
<Button
...
style="?android:attr/borderlessButtonStyle"
....
/>
kann jemand in der Zukunft brauchen.
Es gibt bereits einen Stil, den Sie nutzen können, um die Ränder nicht zu haben.
sich bewerben
style="@style/Base.Widget.AppCompat.Button.Borderless"
zu Ihrem Artikel, um die Ränder zu entfernen
Ich habe dieses global durch Einstellung von Android:stateListAnimator="@null"
in Resources\values\styles.xml
behoben:
<?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>
Und voila die Schatten sind für immer verschwunden :)
"Schatten" -Effekt wird hinzugefügt bei Lollipop Appcompat-Design
fügen Sie die folgende Zeile in res/values-v21/styles.xml hinzu, um den Standardschatten zu entfernen
Themenebene:
<item name="Android:buttonStyle">@style/Widget.AppCompat.Button.Borderless</item>
XML-Layout:
Android:stateListAnimator="@null"
Java:
setStateListAnimator(null);
Kotlin:
stateListAnimator = null
Problem
Ab Android v21 wurde für alle Schaltflächen standardmäßig Rand hinzugefügt.
<!-- 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>
Lösung
Legen Sie in unserem Anwendungsthema den Schaltflächenstil fest, um den Standardrahmen zu entfernen (die Android-Unterstützungsbibliothek selbst stellt den entsprechenden Stil bereit).
<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>
Ich würde vorschlagen, dass Sie den Schatten einfach vollständig entfernen, indem Sie die Höhe auf nichts setzen. Da Sie bereits über einen XML-Stil verfügen (fügen Sie diesen hinzu, um diesen universell zu verwenden), oder fügen Sie dieses Attribut Ihrer XML-Sichtdefinition hinzu
Android:elevation="0dp"
Schaltflächen in Android verfügen über die Eigenschaft statelistAnimator. Wenn Sie also Null angeben, können Sie den Rand der Schaltfläche entfernen
Android:stateListAnimator="@null"
Wenn Sie dies programmgesteuert in Kotlin durchführen möchten, können Sie dies tun
button.stateListAnimator = null
in xml können wir verwenden
Android:stateListAnimator="@null"