我有一个“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
文件的字体名称,View将解析并设置自定义字体。
// 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之前),由于时间不足以模块化,我在一些项目中使用了这个côde并且它始终正常工作,我可以在我应用的样式中指定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添加依赖项时,我会看到所有的Typeface类,并且可以照常使用它们(在代码或布局中)。该项目也是构建的,但是在运行它时,在给其中包含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
│ 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服务器) - 到目前为止结果是一样的。
答案 0 :(得分:0)
我刚从Idea导入Android Studio,发现getsStyledAttributes找不到所有属性(运行时)。 在Idea中编译相同的代码,属性再次正常。 我认为你可能会遇到同样的问题。
问题已于2014年10月10日解决: 问题74140:使用大写字母的包名会导致类加载问题。 https://code.google.com/p/android/issues/detail?id=74140