覆盖按钮文本颜色不起作用

5

我使用了buttonBarStyle和buttonBarButtonStyle来为按钮栏创建了一个自定义主题。它可以正常工作,但是我想要改变按钮的文本颜色,但它仍然采用默认颜色(@android:color/primary_text_holo_light)。 我的代码如下:

<style name="ButtonBarTheme" parent="AppTheme">
        <item name="buttonBarStyle">?android:attr/buttonBarStyle</item>
        <item name="buttonBarButtonStyle">?android:attr/buttonBarButtonStyle</item>
        <item name="android:textColor">#ffffff</item>
</style>

关于布局:

<LinearLayout 
    style="?android:attr/buttonBarStyle"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#0090cc"
    android:orientation="horizontal" >

    <Button
        android:id="@+id/bar_button1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        style="@style/ButtonBarStyleButton"
        android:text="Button 1" />

    <Button
        android:id="@+id/bar_button2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        style="?android:attr/buttonBarButtonStyle"
        android:text="Button 2" />

</LinearLayout>

AppTheme继承自AppBaseTheme,后者又继承自android:Theme.Holo.Light.DarkActionBar。

我该怎么做才能改变按钮文本的颜色?

编辑:我尝试在每个元素上应用颜色,这样可以生效,但是我想通过重写样式文件中的颜色来改变它(将所有设计属性都放在一个地方,类似于CSS)。

此外,我还尝试创建了一个具有"?android:attr/buttonBarStyle"属性的样式。

   <style name="ButtonBarStyleButtonBase">
        <item name="buttonBarButtonStyle">?android:attr/buttonBarButtonStyle</item>
    </style>

   <style name="ButtonBarStyleButton" parent="ButtonBarStyleButtonBase">
        <item name="android:textColor">#ffFFff</item>
    </style>

但它的行为很奇怪:颜色已更新,但没有从父样式继承的属性可见。

你有没有尝试直接将颜色添加到按钮元素中,而不是在AppTheme中更改颜色?(或者我漏掉了什么吗?) - Pimp Trizkit
是的,我做到了,并且它也奏效了,但我想通过在样式文件中覆盖颜色来改变它,我不想将样式和颜色分开放置。我想应用CSS的概念,但我似乎无法完全理解如何在Android中应用和覆盖某些样式属性的方法。 - Andrei F
你能否同时包含一个按钮的XML代码? - TheIT
完成了。我已经添加了布局代码。 - Andrei F
2个回答

4
我想先说明一下,我并不完全了解什么是按钮栏。除了为其定义一些样式属性外,安卓开发文档似乎没有提到它们,因此我不确定它们如何映射到实际的视图/小部件。
我认为你可能没有区分样式和主题之间的区别。样式用于应用于视图以定义其属性。而主题应用于整个应用程序或单个活动,并提供在应用/活动中显示的视图的默认样式定义(以及其他内容)的能力。
更重要的是,例如buttonBarStyle和buttonBarButtonStyle这样的属性仅由活动用于解析按钮栏和按钮栏内的按钮的默认样式。由于这些属性仅由活动解析,如果直接应用于您的视图,则会被忽略。
因此,如果您想使用主题来应用样式,则需要创建一个新的样式定义,该定义扩展所需的基本样式,然后将该自定义样式重新分配回主题定义中的适当视图样式属性。
<style name="CustomButtonStyle" parent="@android:attr/buttonStyle">
        <item name="android:textColor">#ffffff</item>
</style>


<style name="AppTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">
        <item name="buttonStyle">@style/CustomButtonStyle</item>
</style>


<application
    ...
    android:theme="@style/AppTheme" >

所有没有明确样式属性的按钮现在都将显示为白色文本。

但是,对于您特殊的情况,想要显示ButtonBar风格的按钮,您应该注意到ButtonBar风格不会自动应用于您的按钮。您必须手动定义要显示此样式的按钮。因此,上面的示例现在将更像这样:

<style name="CustomButtonBarStyle" parent="@android:attr/buttonBarStyle">
        <item name="android:textColor">#ffffff</item>
</style>


<style name="AppTheme" parent="@android:style/Theme.Holo.Light.DarkActionBar">
        <item name="buttonBarStyle">@style/CustomButtonBarStyle</item>
</style>


<application
    ...
    android:theme="@style/AppTheme" >

现在,应用当前主题中定义的ButtonBar样式:
<Button
        ...
        style="?android:attr/buttonBarStyle"/>

请注意,这将应用当前主题定义的ButtonBar样式(除非被Activity覆盖,否则该样式在整个应用程序中都是相同的)。还要注意,因为您正在引用为当前主题定义的样式,所以可以根据所需的资源限定符不同而定义当前主题,而无需更改布局代码。

1
+1 - 只是因为这是一个很好的例子。我学到了如何自定义主题。 - Pimp Trizkit
我已经尝试过了,有两个问题:1. 当声明parnet="?android:attr/buttonBarStyle"时,在那一行收到"No resource found that matches..."的信息,所以我用"@"替换了"?",这样它可以工作,但是2. 父级的样式不可见(我相信我定义的样式被正确地应用了,因为文本颜色变成了白色)。注意:在Android中,按钮栏不是一个实际的小部件/视图(它实际上更像是一个概念...)。 - Andrei F
当您说父级样式不可见时,您是指您期望从父Holo主题中继承的样式属性吗?您能详细说明问题是什么吗? - TheIT
是的,android:attr/buttonBarStyle和?android:attr/buttonBarButtonStyle中的样式不可见。我错过了什么,但我想不出来是什么...顺便问一下,你在代码中尝试过你的示例吗?这个示例真的很好,就像在开发指南中一样,但除了你指定的设置之外,我可能忘记了其他设置。 - Andrei F
抱歉,我还有12个小时才能回到电脑前,但我会在那时检查一切。感谢提供详细信息,我非常喜欢解决这些问题 :) - TheIT
显示剩余2条评论

0

我尝试了这里提供的其他解决方案,但都没有成功。在这种情况下,尝试使用私有样式(android:attr/buttonBarStyle)作为父级会导致错误。

解决更改buttonBarStyle下按钮颜色问题的方法是通过为按钮分配背景来重新创建android:attr/buttonBarStyle:

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

然后指定:

android:textColor="@color/your_color"

这将正确更改按钮的文本颜色,同时保留buttonBarButtonStyle的外观。


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