【问题标题】:How to remove border/shadow from lollipop buttons如何从棒棒糖按钮中删除边框/阴影
【发布时间】:2015-06-23 13:00:02
【问题描述】:

对于 api

这张彩色图片可能更清晰。按钮周围有某种边框。

我的buttonssstyle是这样定义的:

<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:elevation="0dp" 设置为您的主布局。

标签: android button android-5.0-lollipop


【解决方案1】:

Lollipop 有一个叫做stateListAnimator 的讨厌的小功能,它处理按钮上的高度,这会导致阴影。

删除stateListAnimator 以消除阴影。

您有多种选择:

Java:

button.setStateListAnimator(null);

科特林:

button.stateListAnimator = null

或在您的布局 xml 中:

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

【讨论】:

  • 另一个想法是,使用 Textviews 而不是 Buttons。他们没有这种意外的行为。
  • 如果有效,请将答案标记为“已接受”。我很高兴能帮到你;)
  • 您也可以将button.setStateListAnimator(null); 用于 API 级别 21 及更高级别
  • @oberflansch 如果您切换到 TextViews,您将失去一些按钮的预配置辅助功能。
  • 这会导致某些三星设备发生本机崩溃。仅供任何经历过的人参考。最好使用主题。
【解决方案2】:

我使用的最好和最简单的方法是将样式属性设置为按钮

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

将来可能有人需要。

【讨论】:

  • 有没有办法以编程方式使用这个答案?
【解决方案3】:

已经有一种可以利用的样式来消除边框。

申请

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

为您的项目移除边框

【讨论】:

    【解决方案4】:

    Lollipop Appcompat 主题

    添加了“阴影”效果

    在 res/values-v21/styles.xml 中添加以下行以删除默认阴影

    主题级别:

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

    xml 布局:

    android:stateListAnimator="@null"
    

    Java:

    setStateListAnimator(null);
    

    科特林:

    stateListAnimator = null
    

    【讨论】:

      【解决方案5】:

      我通过在Resources\values\styles.xml 中设置android:stateListAnimator="@null" 修复了这个全局

      <?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】:

        android 中的按钮具有 statelistAnimator 属性,因此通过将其声明为 null 我们可以移除按钮的边框

        android:stateListAnimator="@null"
        

        【讨论】:

          【解决方案7】:

          我们可以在xml中使用

          android:stateListAnimator="@null"
          

          【讨论】:

            【解决方案8】:

            我建议您通过将高度设置为空来完全移除阴影。由于您已经拥有 XML 样式(添加此样式以普遍使用此样式),或者您可以将此属性添加到您的 XML 视图定义中

            android:elevation="0dp"
            

            【讨论】:

            • 我试过设置海拔,但没有解决问题。
            • 您到底想删除什么?海拔会消除阴影(我想我不清楚)
            • 我刚刚添加了第二张图片,可能会更清楚地说明我要删除的内容。按钮周围有某种边框/阴影。
            • 如果您在其他地方使用高程,这也会弄乱您的布局。您也可以尝试通过outlineProvider="@null" 设置大纲提供程序,但不确定是否可行。
            • @Booger 在 Button 上的 Android 8 上不起作用。但是android:stateListAnimator="@null" 可以。
            【解决方案9】:

            问题

            1. 从 Android v21 开始,默认为所有按钮添加了边框。

              <!-- 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>
              

            【讨论】:

              【解决方案10】:

              如果您想在 Kotlin 中以编程方式执行此操作,您可以这样做

              button.stateListAnimator = null
              

              【讨论】:

                猜你喜欢
                • 2016-10-14
                • 2015-08-12
                • 2017-01-29
                • 2015-02-26
                • 2015-09-22
                • 2015-02-23
                • 1970-01-01
                • 2022-01-01
                • 1970-01-01
                相关资源
                最近更新 更多