未正确加载主题的StyledAttributes

时间:2013-08-07 11:38:14

标签: android android-styles android-custom-attributes

我在一个名为font的textview中添加了一个自定义属性。这会自动加载自定义字体。

示例xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent" >

  <com.egeniq.widget.TextView
    android:layout_width="match_parent"
    android:layout_height="44dp"
    app:font="MyriadPro"
    android:text="@string/login_welcome" />
</RelativeLayout>

自定义小部件在其构造函数中执行以下操作:

    TypedArray styledAttrs = context.obtainStyledAttributes(attrs, R.styleable.TextView);
    String customFont = styledAttrs.getString(font);
    // snip. The error occurs here

R.styleable.TextView声明为:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <attr name="font" format="string" />

    <!-- TextView -->
    <declare-styleable name="TextView">
        <attr name="font" />
    </declare-styleable>

</resources>

当所有内容都按照上面的定义时,它就有效。变量String customFont设置为正确的名称(MyriadPro)。

尝试通过样式自动应用此值时,customFont字符串为空。

样式声明为:

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">

    <style name="Theme.BicycleBuddy" parent="android:Theme.Light.NoTitleBar">
        <item name="android:textViewStyle">@style/Widget.TextView</item>
    </style>

    <!-- Override defaults -->
    <style name="Widget.TextView" parent="@android:style/Widget.TextView">
        <item name="font">MyriadPro</item>
    </style>

</resources>

主题包含在清单中:

<application
    android:name=".Application"
    android:allowBackup="true"
    android:hardwareAccelerated="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/Theme.BicycleBuddy" >
</application>

<item name="font"></item>没有错误。加载自定义窗口小部件并命中断点。但是如上所述。如果这样使用,'customFont'属性在读取后为null。

堆栈的屏幕截图:第一个(其中customFont不为null)是XML本身包含app:font=""属性的位置。第二个是它不包含这个属性的地方,但应该从样式加载的地方

Custom font not null. XML includes <code>app:font=""</code> Custom font is null. XML does not include <code>app:font=""</code>

View元素不同的原因是因为它们只是2个不同的textview。具有完全相同的属性。只有1个包含app:font=""而另一个不包含{{1}}。断点按照我期望的顺序依次命中。

如你所见,几乎一切都是平等的。即使是styledAttrs背后的ID也是一样的。然而,如果它没有在XML中显式声明字体属性,则不会加载它。

我希望有人能直接看到我所缺少的联系。但我确实意识到这是一个相当模糊的问题。

请注意,com.egeniq。*是附加到我的项目的自定义库。 styles.xml在'main project'中声明,而attrs.xml来自库项目

0 个答案:

没有答案