如何正确删除Android中按钮周围的填充(或边距?)?

目前,我有以下底部登录按钮。

没有按下按钮时

在此处输入图像描述

按下按钮时

在此处输入图像描述

XML看起来像这样

 

我想在按下按钮时删除按钮周围的填充(或者我应该将其称为边距?请参阅我最底层的p / s部分)。

我看看如何删除Android中按钮周围的填充?

我试过了

 

它不起作用也没有效果。


我进一步尝试

 

按下时不再填充。 然而,设计压制视觉效果的材料也将消失。

我可以知道在压制过程中删除按钮填充的最佳方法是什么,但保留材料设计的按压视觉效果?

P / S

我真的不知道是否应该称之为填充或边距。 我希望实现的是,当我们按下底部区域时,按下视觉效果更改应该覆盖整个100%底栏区域( @+id/sign_in_bottom_nav_bar ),而不是当前95%的底栏区域。

Related of "如何正确删除Android中按钮周围的填充(或边距?)?"

标准按钮不应该在全宽度使用,这就是您遇到此问题的原因。

背景

如果您查看材料设计 – 按钮样式,您将看到一个按钮具有48dp的高度单击区域,但由于某种原因将显示为36dp的高度。

这是您看到的背景轮廓,它不会覆盖按钮本身的整个区域。
它有圆角和一些填充,应该可以自己点击,包装其内容,而不是跨越屏幕底部的整个宽度。

如上所述,你想要的是一个不同的背景 。 不是标准按钮,而是可选项目的背景,具有良好的涟漪效果。

对于此用例,可以使用?selectableItemBackground主题属性,您可以将其用于背景(尤其是列表中)。
它将添加平台标准波纹(或<21上的某些颜色状态列表)并将使用您当前的主题颜色。

对于您的用例,您可以使用以下内容:

   

如果您的视图是唯一的视图并且跨越整个屏幕,则也无需添加布局权重

如果你对背景看起来有什么不同的想法,你必须自己创建一个自定义绘图,并在那里管理颜色和状态。

styles.xml

  

values/drawable

my_drawable.xml

 < ?xml version="1.0" encoding="utf-8"?>      

selector.xml

 < ?xml version="1.0" encoding="utf-8"?>      

values/drawable-v21

my_drawable.xml

 < ?xml version="1.0" encoding="utf-8"?>     

selector.xml

 < ?xml version="1.0" encoding="utf-8"?>    

在布局中:

  

API 19的结果:

在此处输入图像描述

API 21的结果:

在此处输入图像描述

源代码

我认为解决这个问题的最佳解决方案是创建自己的Ripple Effect 。 按下按钮时的填充符合组件的默认Ripple Effect

    

或者您可以尝试将按钮的样式更改为style="?android:textAppearanceSmall"

请记住:此效果仅在Android Lollipop (API 21)或更高版本上显示。

我经历过你正在经历的事情。 简而言之,您只能单独使用标签干净利落,同时确保向后兼容性。

最简单和最广泛实践的方法是在周围使用参考底图。

按钮代码:

     

无论您何时需要使用按钮,都可以使用此完整代码。

这是细分:


  1. OnClick事件将被挂钩到myButton
  2. 通过更改myButtonUnderlay属性来控制按钮的尺寸。
  3. myButtonandroid:background="?attr/selectableItemBackgroundBorderless" 。 这将使它成为一个透明的按钮,只有文本和向后兼容的涟漪。
  4. myButtonUnderlay ,您将执行所有其他后台应用程序,例如设置按钮的颜色,边距,填充,边框,渐变和阴影等。
  5. 如果希望操纵按钮的可见性(程序化与否),则可以在myButtonUnderlay

注意:为确保向后兼容性,请确保使用

android:background="?attr/selectableItemBackgroundBorderless" ,而不是

android:background="?android:attr/selectableItemBackgroundBorderless"

我建议你先考虑一下以防万一。

然后,如果不工作,我建议你创建自己的风格(如azizbekian建议)使用android xml drawables,和drawable状态来区分按下/未压缩。

我认为使用你自己的风格可能是最好的答案,因为它将进一步让你更好地控制你的应用程序的显示方式,但使用Android默认主题和样式也允许用户拥有自定义样式,这是一个好主意。 但是,您无法测试每个自定义样式,因此您无法检查您的应用程序是否会在所有自定义样式上正确显示,因此可能会遇到一些问题。

Button背景设置为android:background="?selectableItemBackground"

    

正如@David Medenjak所说,您可以在其开发者网站上阅读Google Material design Button风格 。 使用按钮样式@David Medenjak在他的回答中解释。 你也可以通过以下方式做它也不是填充或边距,但它实际上是按钮的背景效果。 如果要删除它,则可以执行以下操作。

选项1:

第1步:将以下代码放在styles.xml中

  

第2步:在drawables文件夹下创建一个新的XML文件并添加以下代码:我将我的XML文件命名为button_prime.xml

         

第3步:使用Button中的样式和drawable,如下所示。

  

选项2:

使用支持库v7,所有样式实际上已经定义并可以使用,对于标准按钮,所有这些样式都可用。所以你可以设置这样的按钮样式

  

有关Button风格的更多细节,请查看此答案

我想你也会检查这个答案 。 我希望你能得到你的解决方案。

填充和边距可能是按钮中使用的原始资源的结果。

因此,您可以尝试使用选择器更改使用的资源:

       

这将改变按钮的默认图像/形状,因此您可以尝试使用drawable并将每个项目设置为drawable。 drawable可以是位图,也可以是.xml文件(样式文件),用于定义当前状态下按钮的外观。 我假设即使你自己设置了按钮式,仍然会包含一些原生样式。 这可能是因为您没有使用自定义主题。 所以这个问题也可以通过defing来解决

 theme="@style/myNewTheme" 

myNewTheme是你的主题,它应该有任何父母(不应该定义parent="" )。

采用任何给定的主题(由Google / Android设计,用于实例Theme.AppCompat。[name]),它也带有buttonStyle。 这是Theme.Holo.Light的一部分:

   @style/Widget.Holo.Light.Button @style/Widget.Holo.Light.Button.Small @style/Widget.Holo.Light.Button.Inset @style/Widget.Holo.Light.Button.Toggle @style/Widget.Holo.Light.CompoundButton.Switch @style/Widget.Holo.Light.MediaRouteButton @drawable/item_background_holo_light ?attr/selectableItemBackground @style/Widget.Holo.Light.Button.Borderless @drawable/ic_ab_back_holo_light 

如您所见,此主题定义了按钮在基本function中的外观/工作方式。 你可以覆盖它的一部分,但你没有覆盖重要的部分(是buttonStyle和类似的)。 因此,如果您自己创建一个新主题并根据自己的喜好设置它并设置主题(使用theme =“themename”)并且该主题不会inheritance任何主题,您应该能够根据自己的喜好设置按钮的样式而不必担心关于主题中的默认样式

基本上:

调用填充/ margin =“0dp”无济于事。 主题定义的默认drawable在按钮drawable中具有此function,这意味着您无法更改它。 因此,您必须更改按钮样式,或完全更改主题。 确保主题没有任何父级,因为许多主题定义了按钮样式。 您不希望主题定义按钮样式。

1.添加一个名为maybe_background.xml的可绘制资源文件

 < ?xml version="1.0" encoding="utf-8"?>              

2.使用button_background.xml作为按钮背景,完成!

github上

博客

我真的不知道是否应该称之为填充或边距。

该按钮用于显示表面高度,以提供响应触摸的视觉反馈。 它是用于表面反应的两种反馈之一; 第一个是涟漪效应。 例如,凸起按钮的静止状态高度为2dp,按下状态高度为8dp(请参见“阴影”下的凸起按钮)。 按钮在接触表面时与手指相遇。

我可以知道在压制过程中删除按钮填充的最佳方法是什么,但保留材料设计的按压视觉效果?

回答完第一部分后,如果您想要消除表面高程效果,我不相信您拥有所有的材料设计。

无论如何,这里是如何删除表面高程视觉反馈:

将animator文件button_raise.xml添加到res目录下的animator目录,其中包含以下代码:

 < ?xml version="1.0" encoding="utf-8"?>      

使用stateListAnimator属性在按钮中引用新创建的animation师:

  

希望这可以帮助。