安卓按钮背景颜色改变会影响按钮大小

9

我正在使用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 的情况下得到期望的结果?

还有一个额外的问题:我如何通过编程方式得到期望的结果(我的应用中有动态按钮,因此这将非常有用)?

2个回答

15

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

这是在Manifest文件中定义此按钮的方法:

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

现在,在您的 Java 文件中添加此 XML 布局时,您需要:

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

您也可以使用COLOR: COLOR.RED 以下代码在某些情况下可能无法正常工作: b.setBackgroundColor(int color)


2
不错,它可以工作!为了完整起见,你能解释一下 PorterDuff.mode.MULTIPLY 是什么吗?另外,你知道为什么使用 android:background="@color/..." 的“直观”解决方案不起作用吗? - Eric Leibenguth
我们在设计图形应用程序时主要使用PorterDuff。 PorterDuff被描述为一种将图像组合在一起的方式,就像它们是相互叠加的“不规则形状的纸板片”,以及混合重叠部分的方案。这里有一篇文章可以更好地解释: http://ssp.impulsetrain.com/porterduff.htmljava.lang.Object ↳ java.lang.Enum<android.graphics.PorterDuff.Mode> ↳ android.graphics.PorterDuff.Mode参考资料:http://developer.android.com/reference/android/graphics/PorterDuff.Mode.html - Prateek Mishra
关于您的问题,为什么您的本地方法没有起作用:当您使用背景时,背景会更改文本所在部分的背景。背景取决于您使用的文本大小。如果要更改整个背景,您可能需要使用setColorFiller(Color.RED)函数。 - Prateek Mishra

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,它是创建按钮的更简单的方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接