如何在res / values / dimens.xml中使用主题定义变量?

时间:2011-05-11 23:35:10

标签: android xml themes

你好。 在我的themes.xml定义中,我有以下内容:

<style name="mythemename">
     <item name="d_myvar">100dip</item>
</style>

我希望能够在res / values / dimens.xml中引用它,如下所示:

<dimen name="myvar">?d_myvar</dimen>
唉,这不起作用。当我尝试使用 @ dimen / myvar 作为LinearLayout的高度时,应用程序崩溃并显示错误“您必须提供布局高度属性。”

我也试过

  <dimen name="myvar" value="?d_myvar" />

但那不会编译。

如何在我的xml中定义 @ dimen / myvar ,以便加载主题中定义的?d_myvar 变量?

谢谢!

3 个答案:

答案 0 :(得分:2)

100dip部分放在您的dimens.xml中,如下所示:

<dimen name="myvar">100dp</dimen>

然后在您的主题中,如果需要,可以将其引用为@dimen/myvar,或者您可以使用R.dimen.myvar

在代码中引用它

换句话说,你没有在主题中设置维度,然后在dimens.xml中引用它,但你反过来说。您可以在dimens.xml中设置维度,然后在主题/样式xml中引用该维度。

答案 1 :(得分:2)

我在意大利创业场景中看到了您的帮助请求。

不幸的是,根据syntax of the dimen tag

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen
        name="dimension_name"
        >dimension</dimen>
</resources>

你根本做不到。实际上,您可以在语法指定时引用主题属性:

 ?[package:][type:]name

<强>解决方案

  • Gix's answer将是定义和重复维度的标准方式。

  • 也许您可以重新组织代码以重用d_myvar through inheritance

  • 作为最后和绝望的手段,我会选择一个shell脚本,使用xml命令行工具自动执行变量替换过程。我从未亲自使用过它们,但请参阅xmllintxmlstarletthis article

答案 2 :(得分:2)

在styles.xml中

<resources>

    <attr format="dimension" name="exampleDimension"/>

    <style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="exampleDimension">100dp</item>
        ...
    </style>
</resources>

然后在你的其他xml中使用new属性,你会像这样使用它

android:padding="?attr/exampleDimension"