2015-06-23 280 views
7

我使用的是内置的主题我的Android应用:的Android按钮的背景颜色改变按钮的大小

<style name="AppTheme" parent="android:Theme.Black"> 
    <!-- Customize your theme here. --> 
</style> 

我很高兴与这一主题,但我想改变一个按钮的背景颜色。下面是它的外观默认:

default

这里的时候我添加背景颜色来此按钮(android:background="@color/play_bg")会发生什么:

enter image description here

咦!它基本上改变了所有按钮的大小,填充和边距!

所以我设法使用backgroundTint属性(android:backgroundTint="@color/play_bg"),以获得期望的结果:

enter image description here

不幸的是,这仅仅是因为API,这是不是我接受的21版本的支持。

所以两个问题:

  • 为什么与按钮的属性的其余部分更改背景混乱?
  • 如何在没有backgroundTint的情况下获得预期结果?

还有一个额外问题:如何以编程方式获得预期结果(我的应用程序中有动态按钮,所以这会非常有用)?

回答

9

您可以在Java文件中更改此颜色。当您的主类加载时,您可以获取此按钮的对象,然后更改颜色。

这里是你如何在清单文件中定义这个按钮:

<Button 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="PLAY" 
android:id="@+id/btn1" 
... /> 

现在,在您的Java文件时要添加你需要

Button b = (Button)findViewByID(R.id.btn1); 
b.getBackground().setColorFilter(0xFFFF0000,PorterDuff.Mode.MULTIPLY); 

您也可以使用COLOR此XML布局:下面的代码有时不适用于我: - b.setBackgroundColor(int color)

+2

尼斯的更简单的方法。有用!为了完整起见,你能解释一下'PorterDuff.mode.MULTIPLY'的作用吗?另外,你知道为什么“android:background =”@ color/...“这个”直观的“解决方案不起作用吗? –

+0

我们主要在设计图形应用时使用PorterDuff。 PorterDuff被描述为一种组合图像的方式,就好像它们是彼此重叠的“不规则形状的纸板块”一样,以及混合重叠部分的方案。 下面是文章中,我发现,WIL更好地解释你: http://ssp.impulsetrain.com/porterduff.html java.lang.Object继承 ↳\t java.lang.Enum中的 \t↳\t android.graphics.PorterDuff.Mode 参考:http://developer.android.com/reference/android/graphics/PorterDuff.Mode.html –

+0

关于你的问题,为什么你的母语的方法没有奏效: 当您使用背景时,背景对文本所在的部分进行了更改。背景取决于您正在使用的文本大小。 对于整个背景更改,您可能需要setColorFiller(Color.RED) –

1

我的情况,我会在这个过程中

<Button 
    android:id="@+id/button1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_margin="3dp" 
    android:background="@color/play_as" 
    android:padding="8dp" 
    android:text="Button" /> 

做或者你可以使用这个link即创建按钮