4

aar私は、 (jarではない)に組み込まれる一種の「android-commons」ライブラリを持っています。これに含まれるものの 1 つは、"Typeface" ビュー (TypefaceTextView、TypefaceButton などの TextView のほとんどのクラス) のカスタム実装です。これを実現するために、attrs.xml(/res/values 内の) my で次のように宣言しました。

<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 の前)、これをモジュール化する時間がなかったため、いくつかのプロジェクトでこのコードを使用しましたが、常に正しく機能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、および継続的インテグレーションに切り替えた後、これらすべてを前述の「コモンズ」ライブラリに入れ、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 は次のとおりです。

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