web-dev-qa-db-ja.com

android Gradleに切り替えた後にカスタムビュー属性が機能しない

私は最近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>
13
Mars

プロジェクトの何が問題なのか、実際にはわかりません。これが私のカスタムビューと属性をどのように使用するかです:

私の図書館プロジェクトでは:

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"
19
Andros

カスタムビューの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);

それを機能させるには

2
alphonzo79

このエラーは、パッケージ名を名前空間として静的に宣言した場合に発生します(例: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 を使用してください。これにより、ツールは、ビルド。

2
Jason Rogena

使うべきだと思います

iconview:name="entypo_search"

の代わりに

iconview:icon_name="entypo_search"
2
GeliteNight

誰かがここにいて、何も機能していないように見える場合。私が見ることができることから、名前空間にアンダースコアがあることはエディターでは問題なく動作するように見えますが、アプリをビルドするときに予期せず中断します。

0
JamEngulfer