私は最近gradleに移行しましたが、カスタムビュー属性はnullを返します
私のプロジェクトはこのように見えます
--custom_icon_view //カスタム属性を持つカスタムビューを保持するライブラリ--my application //これは実際にカスタムビューを使用するメインアプリです
私のレイアウトでは、次のように定義された名前空間があります:
xmlns:iconview="http://schemas.Android.com/lib/be.webelite.iconview"
apk/res-autoを使用すると、属性を識別できなかったというエラーが返されるため
これは私がxmlで定義されたアイコン名を取得しようとする方法です。これは以前は完全に機能していましたが、現在は機能しません。そして私が変更したのはgradleへの移行だけでした。
final TypedArray a = context.obtainStyledAttributes(attrs,be.webelite.iconview.R.styleable.icon);
icon_name = a.getString(be.webelite.iconview.R.styleable.icon_name);
私のgradle.buildファイルが問題を引き起こしていると思いますか?
ライブラリを設定しました
apply plugin: 'Android-library'
メインアプリgradle.buildを次のように終了します
apply plugin: 'Android'
これは私に2日間頭痛を与えてきました:(すべてのヘルプ/ヒントは非常にapperciatedです。
ここに私のgradleファイルがあります
http://pastie.org/private/h57o8nanydosq0dtm6eiq
そしてここにフォルダ構造があります
http://pastie.org/private/nvbzomx2zeagdpzt8qqjsq
これは私が私のビューをxmlで宣言する方法です
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
<!-- tried res-auto didn't work -->
xmlns:iconview="http://schemas.Android.com/apk/lib/be.webelite.iconview"
Android:orientation="vertical" Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@color/background_gray">
<be.webelite.iconview.IconView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
iconview:icon_name="entypo_search"
Android:textSize="25dp"/>
iconView> res> valuesディレクトリのattrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="icon">
<attr name="name" format="string" />
</declare-styleable>
</resources>
プロジェクトの何が問題なのか、実際にはわかりません。これが私のカスタムビューと属性をどのように使用するかです:
私の図書館プロジェクトでは:
attrs.xml:
<declare-styleable name="CustomFontSize">
<attr name="typeFace" format="string" />
</declare-styleable>
私のカスタムクラスで:
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CustomFontSize);
if (a == null) {
return;
}
CharSequence s = a.getString(R.styleable.CustomFontSize_typeFace);
if (s != null) {
// do something
}
ここに私の主なプロジェクトで私のレイアウトの例:
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:custom="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical"
Android:paddingLeft="@dimen/border_margin_pulltorefresh"
Android:paddingRight="@dimen/border_margin_pulltorefresh"
Android:paddingBottom="@dimen/divider_height">
<com.custom.view.TextViewFont
style="@style/DateStyle"
Android:id="@+id/news_date"
Android:shadowColor="@color/white"
Android:layout_gravity="center_vertical"
Android:gravity="center_vertical"
custom:typeFace="@string/font_roboto_condensed_bold"/>
</LinearLayout>
それが役に立てば幸い...
編集:
私の「主プロジェクト」のbuild.gradle
dependencies {
compile project(":MyLibraryProject")
}
そしてここに私のライブラリのbuild.gradle:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.Android.tools.build:gradle:0.7.+'
}
}
apply plugin: 'Android-library'
repositories {
mavenCentral()
}
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
compile 'com.Android.support:support-v4:19.0.0'
compile 'com.actionbarsherlock:actionbarsherlock:4.4.0@aar'
compile project(':WebediaCore:dependencies:DataDroid')
compile project(':WebediaCore:dependencies:ViewPagerIndicator')
compile project(':WebediaCore:dependencies:ActionBar-PullToRefresh')
compile project(':WebediaCore:dependencies:Android-Universal-Image-Loader')
}
Android {
compileSdkVersion 19
buildToolsVersion '19'
defaultConfig {
minSdkVersion 8
targetSdkVersion 19
}
}
EDIT1:
この名前空間を使用してみてください:
xmlns:custom="http://schemas.Android.com/apk/res-auto"
そして置き換えます:
iconview:icon_name="entypo_search"
沿って :
custom:name="entypo_search"
カスタムビューのinitメソッドで特定の名前空間へのハード参照を使用して属性を取得している場合、res-autoに変更するとそれが壊れます。代わりに、これらの参照もres-autoに変更する必要があります。または、推奨される方法は、型指定されたインターフェイスを取得することです。たとえば、私のプロジェクトではこれ:
textStyle = attrs.getAttributeIntValue("http://schemas.Android.com/apk/res/com.bodybuilding.mobile", "textStyle", 10);
shadowInner = attrs.getAttributeBooleanValue("http://schemas.Android.com/apk/res/com.bodybuilding.mobile", "shadowInner", true);
shadowOuter = attrs.getAttributeBooleanValue("http://schemas.Android.com/apk/res/com.bodybuilding.mobile", "shadowOuter", false);
allowResize = attrs.getAttributeBooleanValue("http://schemas.Android.com/apk/res/com.bodybuilding.mobile", "allowResize", true);
これになりました:
textStyle = attrs.getAttributeIntValue("http://schemas.Android.com/apk/res-auto", "textStyle", 10);
shadowInner = attrs.getAttributeBooleanValue("http://schemas.Android.com/apk/res-auto", "shadowInner", true);
shadowOuter = attrs.getAttributeBooleanValue("http://schemas.Android.com/apk/res-auto", "shadowOuter", false);
allowResize = attrs.getAttributeBooleanValue("http://schemas.Android.com/apk/res-auto", "allowResize", true);
しかし、できればこれ:
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.BBcomButton);
textStyle = a.getInt(R.styleable.BBcomButton_textStyle, 10);
shadowInner = a.getBoolean(R.styleable.BBcomButton_shadowInner, true);
shadowOuter = a.getBoolean(R.styleable.BBcomButton_shadowOuter, false);
shadowInnerColor = a.getColor(R.styleable.BBcomButton_shadowInnerColor, 0xff000000);
shadowOuterColor = a.getColor(R.styleable.BBcomButton_shadowOuterColor, 0xff000000);
allowResize = a.getBoolean(R.styleable.BBcomButton_allowResize, true);
それを機能させるには
このエラーは、パッケージ名を名前空間として静的に宣言した場合に発生します(例:xmlns:iconview = "http://schemas.Android.com/apk/lib/be.webelite。 iconview "in your case)in a layout file and try build the project with Lint on。チェック Android Gradle Lintチェック :
Gradleプロジェクトでは、最終的なAPKで使用される実際のパッケージは異なる場合があります。たとえば、.debugパッケージのサフィックスを一方のバージョンに追加し、もう一方のバージョンに追加することはできません。したがって、アプリケーションパッケージをリソースにハードコーディングしないでください。代わりに、特別な名前空間 http://schemas.Android.com/apk/res-auto を使用してください。これにより、ツールは、ビルド。
使うべきだと思います
iconview:name="entypo_search"
の代わりに
iconview:icon_name="entypo_search"
誰かがここにいて、何も機能していないように見える場合。私が見ることができることから、名前空間にアンダースコアがあることはエディターでは問題なく動作するように見えますが、アプリをビルドするときに予期せず中断します。