为什么在按钮上设置android:background会导致L / R填充丢失?

时间:2016-10-11 15:18:03

标签: android button background android-studio-2.2

我正在使用带有这些设置的项目的Android Studio 2.2.1:

compileSdkVersion 24
buildToolsVersion "24.0.2"
minSdkVersion 16
targetSdkVersion 24

如果我使用GUI更改按钮背景,则会将其添加到布局中:

android:background="@color/colorPrimary"

然后,如果我在4.4虚拟设备上运行应用程序(微软的Android模拟器,因为我在AMD系统上,我想要一个快速模拟器),或者在带有Android 6.0.1的三星Galaxy S6上运行该按钮,正确的颜色但丢失了左右填充,文本右键移动到按钮的左右边缘。

如果我只设置backgroundTint,则按钮在虚拟设备上具有正确的填充,但颜色不正确。但是,在S6上,它具有正确的颜色和填充。

这似乎是某个地方的错误,但在哪里?是代码生成还是Android 4.4中的错误?

我认为Android Studio应该采取一切必要措施,使其在两个平台级别上都能正常工作,无论它是否像其中一些解决方案一样复杂:

Standard Android Button with a different color

或更简洁的东西。

我的styles.xml文件显示:

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

</resources>

我的AndroidManifest主题设置为:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"

1 个答案:

答案 0 :(得分:1)

  

这似乎是某个地方的错误,但在哪里?

就在这里:

android:background="@color/colorPrimary"
  

是代码生成还是Android 4.4中的错误?

不,这是你的替代背景。它是一种颜色,没有任何内在填充,也没有被StateListDrawable包裹。

Button窗口小部件的库存背景具有一定量的填充作为背景本身的一部分(例如,通过用于背景的九个补丁PNG中的一些透明像素)。实际背景本身是StateListDrawable,它根据Button的状态选择要应用的其他几个可绘制资源中的一个(例如,正常,按下,聚焦,禁用)。

要替换Button背景,您需要先使用自己的StateListDrawable。否则,您的Button似乎无法直观地响应点击事件或其他状态更改(例如,被禁用)。然后,您可以在状态的背景中加入一些填充,或者根据需要在Button窗口小部件上添加填充。

  

我认为Android Studio应该做任何需要使它在两个平台级别上都正常工作

Android Studio假设您知道自己在做什么。没有严格要求Button背景具有这种填充,并且没有强硬要求Button是对用户有意义的东西(对比&# 34,嘿,当我按下它时,为什么这个按钮似乎没有视觉反应?&#34;)。在某些情况下,开发人员 希望Button窗口小部件没有填充,例如在分段列表控件的复合窗口小部件的实现中。

就个人而言,我认为在Button背景下有一些内在填充的决定是令人遗憾的。但是,这就是它在Android 1.0中实现的方式,并且谷歌已经选择维持这种方法,即使使用较新的主题,也可能是为了向后兼容。

  

如果我只设置backgroundTint,那么按钮在虚拟设备上有正确的填充,但颜色不正确

我没有使用backgroundTint使用appcompat-v7。您可能在那里看到了一个错误。您可以考虑使用完整示例和屏幕截图发布单独的问题,以获得有关该特定问题的更具体帮助。