如何在样式中引用颜色属性

时间:2015-05-12 13:04:50

标签: android android-layout themes android-xml

我想使用相同的drawable(具有不同的颜色)作为一个布局中所有按钮的背景。

抽拉/ my_vector.xml

<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:height="60px"
    android:width="360px"
    android:viewportHeight="60"
    android:viewportWidth="360" >

    <path
        android:name="bottom"
        android:pathData="M 0,60 L 360,60"
        android:strokeColor="?attr/testColor"
        android:strokeWidth="4" />

</vector>

如果我直接替换strokeColor值[android:strokeColor="#ffff0000"]

,上面的代码将绘制一个storke width = 4px的水平线

但根据要求,背景可以有不同的颜色。这就是我添加?attr/testColor并希望使用样式定义它的原因。

值/ attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">

    <declare-styleable name="dummyStyle">
        <attr name="testColor" format="color|reference" />
    </declare-styleable>

</resources>

值/ styles.xml

<resources xmlns:android="http://schemas.android.com/apk/res/android"
    <!-- Application theme. -->
    <style name="AppTheme" parent="AppBaseTheme">

        <!-- <item name="testColor">#ff0000ff</item> -->

    </style>

    <style name="MyButton" parent="android:Widget.DeviceDefault.Button">
        <item name="android:background">@drawable/my_vector</item>
    </style>

    <style name="MyButton.Green">
        <item name="testColor">#ff00ff00</item>
    </style>

    <style name="MyButton.Red">
        <item name="testColor">#ffff0000</item>
    </style>
</resources>

layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <Button
        android:layout_marginTop="10px"
        android:id="@+id/test01"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@style/MyButton.Green"
        android:text="Test01" />

    <Button
        android:layout_marginTop="10px"
        android:id="@+id/test02"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@style/MyButton.Red"
        android:text="Test02" />

</LinearLayout>

什么有效:
如果我在testColor中取消注释AppTheme,则所有按钮都会以蓝色线条作为背景。

什么行不通:
如果我通过在Button上应用它来使用具有不同颜色的两种不同样式(MyButton.Green,MyButton.Red),我得到的只是透明背景。

1 个答案:

答案 0 :(得分:0)

尝试明确引用您的父样式public interface MyOptions extends DataflowPipelineOptions { // Common options here. @Override @Default.Class(DataflowPipelineRunner.class) Class<? extends PipelineRunner<?>> getRunner(); } ... MyOptions options = PipelineOptionsFactory.fromArgs(args).withValidation().as(MyOptions.class);