如何使用 Holo 主题更改 Android 中按钮的背景颜色?

发布于 2024-12-04 22:46:38 字数 1137 浏览 0 评论 0原文

在开发 Android 应用程序时,我遇到了这个问题。使用 Android 3.0 Holo 主题时,我无法更改按钮的样式。

在我的 theme.xml 文件中是这样的:

 <resources>
     <style name="Test" parent="android:Theme.Holo">
     </style>
 </resources>

我的 manifest.xml 文件有这样的内容:

<application android:icon="@drawable/my_icon"
    android:label="@string/app_name" android:debuggable="false" android:theme="@style/Test">

如果我此时运行应用程序,我会得到默认的 Holo 主题按钮。但我想改变它们的颜色。这似乎是一个透明度问题,但我不知道该去哪里寻找。

我尝试过创建自定义按钮样式。像这样简单的事情:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_selected="true" android:color="@android:color/black" />
        <item android:state_focused="true" android:color="@android:color/white" />
        <item android:state_pressed="true" android:color="@android:color/white" />
        <item android:color="#f8f8f8" />
    </selector>

但这对我不起作用。我尝试过的每种组合都不起作用。

我知道它一定继承了一些使其透明的属性,但我不知道是哪一个。

任何帮助将不胜感激。

While working on an Android app, I came across this problem. I can't change the style of a button while using the Android 3.0 Holo Theme.

In my theme.xml file is this:

 <resources>
     <style name="Test" parent="android:Theme.Holo">
     </style>
 </resources>

My manifest.xml file has this:

<application android:icon="@drawable/my_icon"
    android:label="@string/app_name" android:debuggable="false" android:theme="@style/Test">

If I run the app at this point, I get the default Holo themed buttons. But I want to change the color of them. It seems like it's a transparency issue, but I'm not sure where to look.

I've tried creating a custom button style. Something simple like this:

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <item android:state_selected="true" android:color="@android:color/black" />
        <item android:state_focused="true" android:color="@android:color/white" />
        <item android:state_pressed="true" android:color="@android:color/white" />
        <item android:color="#f8f8f8" />
    </selector>

This doesn't work for me though. Every combination I've tried doesn't work.

I know that it must be inheriting some property that's making it transparent, but I have no idea which one.

Any help would be appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

醉酒的小男人 2024-12-11 22:46:38

尝试使用 android:drawable 而不是 android:color。

例如

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:drawable="@android:color/black" />
    <item android:state_focused="true" android:drawable="@android:color/white" />
    <item android:state_pressed="true" android:drawable="@android:color/white" />
    <item android:drawable="#f8f8f8" />
</selector>

Try using android:drawable instead of android:color.

e.g.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:drawable="@android:color/black" />
    <item android:state_focused="true" android:drawable="@android:color/white" />
    <item android:state_pressed="true" android:drawable="@android:color/white" />
    <item android:drawable="#f8f8f8" />
</selector>
任谁 2024-12-11 22:46:38

由于按钮确实具有背景可绘制对象,因此您可以为该背景可绘制对象着色。必须注意的是,此背景是半透明的,因此色调不会 100%。不过,这在 Holot 黑暗主题上看起来相当不错。

操作方法如下:

Drawable bgDrawable = button.getBackground();

ColorMatrix cmDesat = new ColorMatrix();
cmDesat.setSaturation( 0 );
ColorMatrix cm = new ColorMatrix();
cm.set( new float[]{
  r, 0, 0, 0, 0, 
  0, g, 0, 0, 0, 
  0, 0, b, 0, 0, 
  0, 0, 0, 1, 0
} );
cmDesat.postConcat( cm );
bgDrawable.setColorFilter( new ColorMatrixColorFilter( cmDesat ) );

尝试使用矩阵进行试验,因为它可以产生不同的结果。另外,您可以简单地使用 LightingColorFilter 来代替 ColorMatrixColorFilter,它更容易处理,但不那么灵活。

Since a button does have a background drawable you can tint this background drawable. It has to be noted though that this background is semi transparent so the tint will not bee 100%. This looks pretty nice on the Holot dark theme though.

Here is how you do it:

Drawable bgDrawable = button.getBackground();

ColorMatrix cmDesat = new ColorMatrix();
cmDesat.setSaturation( 0 );
ColorMatrix cm = new ColorMatrix();
cm.set( new float[]{
  r, 0, 0, 0, 0, 
  0, g, 0, 0, 0, 
  0, 0, b, 0, 0, 
  0, 0, 0, 1, 0
} );
cmDesat.postConcat( cm );
bgDrawable.setColorFilter( new ColorMatrixColorFilter( cmDesat ) );

Try experimenting with the matrix as it can yield different results. Also instead of the ColorMatrixColorFilter you could simply use the LightingColorFilter which is easier to handle but not as flexible.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文