4

我有一个“android-commons”库,它内置在一个aar(它不是 jar)中。它包含的内容之一是“字体”视图的自定义实现(TextView 的大多数类,例如 TypefaceTextView、TypefaceButton 等)。为了实现这一点,我在我的attrs.xml(在 /res/values 中)声明了以下内容:

<attr name="fontName" format="string" />
<declare-styleable name="CustomFont">
    <attr name="fontName" />
</declare-styleable>

然后我可以声明一个自定义样式,它在我的资产中指定.ttf文件的字体名称,视图将解析并设置自定义字体。

// excerpt from TypefaceTextView

public TypefaceTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    setCustomFont(context, attrs);
}

private void setCustomFont(Context context, AttributeSet attrs) {
    if (!isInEditMode()) {
        Typefaces.setCustomFont(context, attrs, this);
    }
}

该类Typefaces是 Typefaces 的缓存,并包含用于将 Typeface 设置为 TextView 的实用方法:

// excerpt from Typefaces

public static void setCustomFont(Context context, AttributeSet attrs, TextView view) {
    String assetPath = getCustomFontPath(context, attrs);
    setCustomFont(context, assetPath, view); // a method that sets the TF to the view
}

public static String getCustomFontPath(Context context, AttributeSet attrs) {
    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomFont);
    String assetPath = a.getString(R.styleable.CustomFont_fontName);
    a.recycle();
    return assetPath;
}

直到现在(在 Android Studio 之前),由于没有时间对其进行模块化,我在我的几个项目中都有这个代码并且它总是正常工作,我可以指定fontName一种应用于我的视图的样式,一切都很好。

<style name="TestStyle">
    <item name="fontName">ApexNew-Bold.ttf</item>
    <item name="android:textSize">14sp</item>
    <item name="android:textColor">#ffffff</item>
</style>

现在,在切换到 AS、gradle 和持续集成之后,我将所有这些都放入了上面提到的“commons”库中,该库被构建到了一个 aar 文件中。当我向 aar 添加依赖项时,我会看到所有的字体类,并且可以像往常一样使用它们(在代码或布局中)。该项目也可以构建,但是在运行它时,在对其中包含 TypefaceTextView 的布局进行膨胀时出现以下异常:

unable to resolve static field 2955 (CustomFont) in Lmy/package/name/widgets/R$styleable
.....
android.view.InflateException: Binary XML file line #11: Error inflating class my.package.name.widgets.typeface.TypefaceTextView

错误很明显,因为它找不到样式,但我不知道为什么会发生这种情况。这是一个tree解压后的 aar:

AAR
│   AndroidManifest.xml
│   classes.jar
│   R.txt
│
├───aidl
├───assets
└───res
    └───values
            values.xml

R.txt包含以下内容:

int attr fontName 0x7f010000
int[] styleable CustomFont { 0x7f010000 }
int styleable CustomFont_fontName 0

/res/values/values.xml包含以下内容:

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

    <!-- From: file:/C:/Users/vjosip/AndroidStudioProjects/AndroidCommons/widgets/src/main/res/values/attrs.xml -->
    <eat-comment />

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

    <declare-styleable name="CustomFont">
        <attr name="fontName" />
    </declare-styleable>

</resources>

有人可以就这里可能发生的事情提供见解吗?我已经尝试清理项目,在几台不同的机器(包括 jenkins CI 服务器)上重建它 - 到目前为止结果是相同的。

4

1 回答 1

0

我刚刚从 Idea 导入到 Android Studio 并发现 gainStyledAttributes 没有找到所有属性(运行时)。在Idea中编译同样的代码,属性又ok了。我想你可能会面临同样的问题。

问题已于 2014 年 10 月 10 日解决:问题 74140:使用带有大写字母的包名称会导致类加载问题。 https://code.google.com/p/android/issues/detail?id=74140

于 2014-07-25T23:05:35.880 回答