XML 资源中的变量 - 将值从父级传递到子级

2022-09-04 04:38:32

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

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

但是我不想为每个属性值及其排列创建一个单独的 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代码隐藏/避免创建自定义控件/类的需要
  • 使用维度资源可能是一个富有成效的途径?

答案 1

您可以创建

样式属性

,我认为这就是你正在寻找的。它们基本上是可变属性。例如,您可以在主题中使用它.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>

用户只需应用不同的样式即可使用不同的属性。我不知道这个例子是否完整地回答了你的问题,但是通过在主题中声明属性,你可以做很多事情。这些属性是动态引用。有关可能性的详细信息,请参阅此文章


答案 2

推荐