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

Java XML资源中的变量-将值从父级传递到子级,java,android,xml,android-layout,Java,Android,Xml,Android Layout,我正在尝试重用基本形状,并使用这些声明性XML元素组成大部分用户界面 如何创建一个可变的Android属性? 但我不想为每个属性值及其排列创建单独的XML文件,并且在这个过程中重复了大量工作 例如,我希望这个形状的使用者能够定义android:radius值 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android">

我正在尝试重用基本形状,并使用这些声明性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父级设置属性?

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

样式属性

,我想这就是你要找的。它们基本上是可变属性。 例如,您可以在themes.xml中使用此选项

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


在xml父级中设置属性是不可行的。维度资源可以派上用场-例如radius=“@dimen/radius\u round\u blue”并在
values/dimensions.xml
中定义此半径。这可能非常有用,尤其是当此属性根据某些标识符值(如区域设置或屏幕大小)而变化时。然而,为了获得完全的自由,您应该创建java类,但这同样需要额外的编码(设置这些可绘制和bla)@SherifelKhatib我想知道什么是一个好的基于代码的解决方案?依赖于特定于项目的静态主题类的自定义形状类,该类可以定义形状类应使用的非默认属性值(如果存在)?或者可以从代码中更改维度资源值吗?看起来您是在对“android方式”的操作进行任意限制。实现这一点的简单方法是使用自定义类,使用attr.xml文件将参数传递给该类。这里有一个很好的例子说明了如何做到这一点:如果你接受“android方式”,你将在这个环境中获得更愉快的编码体验。我很难最终弄明白这一点。@HalR谢谢!这是一个很棒的东西,您能确认一下在这种情况下是否也可以创建一个自定义选择器,并将自定义属性传递给选择器,然后选择器将相应地修改其项(在代码中)??若选择器不能成为目标,那个么您是说我应该创建自定义形状并从代码中实例化它们,并以编程方式使它们成为选择器的一部分吗?我不确定我是否看到自定义形状自定义属性如何帮助我避免重复XML文件。。在任何情况下,请将您的评论设置为答案,您可能会获得奖励:)这似乎接近于xaml而不是android xml。在Android中,真的没有一个表达式混合来创建自定义对象来操纵它们作为消费者使用。最接近的是HaIR提供的解决方案,非常酷。Android使用ShapeDrawable从xml文件创建可绘制文件。仅当形状定义为矩形时,“拐角”属性才适用。无论哪种方式,都无法获得一些Java代码。这不是WPF,请查看更多信息。虽然引用属性方法不能完全回答我的问题,即如何从父选择器设置变量,并且不同的选择器将在同一项目中设置不同的局部值,但您的方法确实允许特定于项目的全局变量,这是成功的一半!
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- You can define attributes here -->
    <attr name="button_radius" format="reference" />
</resources>
<!-- 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>