14

我正在尝试重用原始形状并使用这些声明性 XML 元素组成我的大部分用户界面。

如何制作一个可变的Android属性?

但我不想为每个属性值及其排列创建单独的 XML 文件,并且在此过程中重复大部分工作。

例如,我希望这个形状的消费者能够定义 android:radius 值?

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient
            android:startColor="#449def"
            android:endColor="#2f6699"
            android:angle="270"/>
    <stroke
            android:width="1dp"
            android:color="#2f6699"/>
    <corners
            android:radius="3dp"/>
</shape>

从消费 XML 父级设置属性?

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:drawable="@drawable/shape_box_round_blue_uniform" />
    <!-- How to set the corner radius here? -->
    <item android:drawable="@drawable/shape_box_round_blue" />
</selector>

解决方案?

  • 如果可能的话,我不想使用任何 Java 代码隐藏/避免创建自定义控件/类的需要
  • 使用维度资源可能是一条富有成效的途径?
4

1 回答 1

4

你可以创建

样式属性

,我认为这是您正在寻找的。它们基本上是可变属性。例如,你可以在你的 theme.xml 中使用它

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- You can define attributes here -->
    <attr name="button_radius" format="reference" />
</resources>

它定义了一个变量引用,称为: button_radius 这可以在样式中使用,或者在布局 xml 文件中使用:

<!-- You can use them like so: -->
<style name="MyApp.Theme1" parent="android:Theme.Holo.Light">
    <item name="button_radius">12</item>
</style>

<style name="MyApp.Theme2" parent="android:Theme.Holo.Light">
    <item name="button_radius">36</item>
</style>

这样,通过更改主题,您可以为半径使用不同的值。下面是一个未经测试的示例,说明如何更改形状可绘制对象:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient
        android:startColor="#449def"
        android:endColor="#2f6699"
        android:angle="270"/>
    <stroke
        android:width="1dp"
        android:color="#2f6699"/>
    <corners
        android:radius="?button_radius"/> <!-- NOTE the ?button_radius-->
</shape>

用户可以简单地应用不同的样式来使用不同的属性。我不知道这个示例是否完整地回答了您的问题,但是您可以通过在主题中声明属性来做很多事情。这些属性是动态引用。有关可能性的更多信息,请参阅本文

于 2013-04-02T18:47:57.033 回答