【问题标题】:Error when getting a dimension in theme for margins在主题中获取边距尺寸时出错
【发布时间】:2014-04-20 14:26:26
【问题描述】:

背景

我正在尝试根据所选主题在 listView 项目上设置自定义边距值。

应用程序有多个主题,用户可以选择使用哪个主题,我通过调用“setTheme()”来设置。

问题

无论我尝试什么,我都会收到此错误:

java.lang.UnsupportedOperationException: Can't convert to dimension: type=0x2

请注意,这只发生在边距属性上,到目前为止还没有其他属性导致这种情况。

我尝试过的

首先,这是我用过的xml sn-ps

attrs.xml

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

styles.xml

<style name="AppTheme_HoloDark" parent="@style/Theme.Sherlock">
  <item name="listview_item__horizontal_spacing">4dp</item>
  ....

listView 项的布局:

<RelativeLayout ...
    android:layout_marginLeft="?attr/listview_item__horizontal_spacing" >

我也尝试使用“reference”作为属性类型,并引用“dimen”资源,但这也会导致同样的异常。

我尝试过的另一件事是动态获取它:

public static int getResIdFromAttribute(final Activity activity,final int attr)
    {
    final TypedValue typedvalueattr=new TypedValue();
    activity.getTheme().resolveAttribute(attr,typedvalueattr,true);
    return typedvalueattr.resourceId;
    }

...
final int spacingResId=getResIdFromAttribute(activity,R.attr.listview_item__horizontal_spacing);

但由于某种原因,我得到 0 作为这个调用的结果。只有在使用this method 时才有效。

问题

发生了什么事?我怎样才能避免这种情况?

真的没有办法克服这个问题,但使用代码(膨胀 xml 时)?

【问题讨论】:

    标签: android android-theme margins dimension


    【解决方案1】:

    您不需要使用 attr XML,这是您的问题。

    将您想要的值放在 res 文件夹中名为 dimens.xml 的文件中(与 strings.xml 的位置相同)。

    这个文件看起来像这样:

    <resources>
        <dimen name="value1">15dp</dimen>
        <dimen name="value2">20dp</dimen>
    </resources>
    

    然后在您的布局 XML 中,您可以直接引用维度(就像引用字符串一样),如下所示:

    <RelativeLayout ...
        android:layout_marginLeft="@dimen/value1" >
    

    或者在定义样式时,在您的 XML 中它看起来像:

     <style name="MyStyle1">
            <item name="android:layout_marginLeft">@dimen/value1</item>
        </style>
    

    然后换成你的其他风格:

    <style name="MyStyle2">
                <item name="android:layout_marginLeft">@dimen/value2</item>
            </style>
    

    【讨论】:

    • 我想根据当前主题设置维度(用户可以选择,然后我在活动真正创建之前使用“setTheme()”。你在这里提供的完全是静态的。
    • 您只需要创建逻辑来进行这些更改。您将为每种样式设置不同的维度值(即,每种样式完全不同的值,在维度文件夹中具有自己的唯一值)。
    • 添加解决方案来回答。
    • 你写的还是很静态的。我需要支持: setTheme(R.style.MyTheme1) 和 setTheme(R.style.MyTheme2) ,每个都有不同的边距尺寸。
    • 当您在 MyTheme1 和 MyTheme2 之间进行更改时,尺寸将从 Value1 更改为 Value2 - 这正是我的答案所显示的,并且是正确的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多