web-dev-qa-db-fra.com

les attributs de vue personnalisés Android ne fonctionnent pas après le passage en dégradé

donc j'ai récemment migré pour gradler maintenant mes attributs de vue personnalisés renvoient null

mon projet ressemble à ceci

--custom_icon_view // bibliothèque contenant la vue personnalisée avec des attributs personnalisés - mon application // c'est l'application principale qui utilise réellement la vue personnalisée

dans ma mise en page, l'espace de noms est défini comme suit:

        xmlns:iconview="http://schemas.Android.com/lib/be.webelite.iconview"

parce que l'utilisation d'apk/res-auto renvoie une erreur indiquant que l'attribut n'a pas pu être identifié

c’est ainsi que j’essaie d’obtenir le nom de l’icône défini en xml, cela fonctionnait parfaitement , mais à présent cela ne fonctionne plus. et tout ce que j'ai changé était de migrer vers le grade.

        final TypedArray a              = context.obtainStyledAttributes(attrs,be.webelite.iconview.R.styleable.icon);
        icon_name = a.getString(be.webelite.iconview.R.styleable.icon_name);

donc je suppose que mes fichiers gradle.build posent un problème?

J'ai la bibliothèque sur 

  apply plugin: 'Android-library'

mettre fin à l'application principale gradle.build as 

  apply plugin: 'Android'

cela me donne mal à la tête depuis 2 jours maintenant :( toutes les aides/astuces sont très apperciated.

voici mes dossiers

http://pastie.org/private/h57o8nanydosq0dtm6eiq

et voici la structure du dossier

http://pastie.org/private/nvbzomx2zeagdpzt8qqjsq

voici comment je déclare mon point de vue dans le 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"/>

attrs.xml dans le répertoire IconView> res> values

        <?xml version="1.0" encoding="utf-8"?>
        <resources>
            <declare-styleable name="icon">
                <attr name="name" format="string" />
            </declare-styleable>

        </resources>
12
Mars

Vous ne pouvez pas vraiment voir ce qui ne va pas dans votre projet. Voici comment j'utilise la vue personnalisée et les attributs dans le mien:

Dans mon projet de bibliothèque:

attrs.xml:

<declare-styleable name="CustomFontSize">
    <attr name="typeFace" format="string" />
</declare-styleable>

dans ma classe personnalisée:

 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
 }

Dans mon projet principal, voici un exemple d'une de mes mises en page:

<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>

J'espère que ça va aider ...

Modifier :

dans mon build.gradle de mon "projet principal" 

dependencies {
    compile project(":MyLibraryProject")
}

Et voici le build.gradle de ma bibliothèque:

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:

Essayez d'utiliser cet espace de noms:

xmlns:custom="http://schemas.Android.com/apk/res-auto"

et remplacer:

 iconview:icon_name="entypo_search"

par :

 custom:name="entypo_search"
17
Andros

Si vous récupérez des attributs dans la méthode init de votre vue personnalisée avec des références précises à cet espace de noms spécifique, le passage à res-auto annulera cette opération. Au lieu de cela, vous devrez également remplacer ces références par res-auto. Ou bien, la méthode préférée consiste simplement à saisir l'interface typée. Par exemple, dans mon projet ceci: 

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);

Est devenu soit ceci: 

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);

mais de préférence ceci:

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);

Pour que ça marche

2
alphonzo79

Vous obtiendrez cette erreur lorsque vous aurez statiquement déclaré le nom de votre package comme espace de noms (par exemple, xmlns: iconview = "http://schemas.Android.com/apk/lib/be.webelite.iconview" dans votre cas). dans un fichier d’agencement et essayez de construire le projet avec Lint activé. Vérifiez le Android Gradle Lint vérifie :

Dans les projets Gradle, le package utilisé dans le fichier APK final peut varier. pour exemple, vous pouvez ajouter un suffixe de package .debug dans une version et non dans l'autre. Par conséquent, vous ne devez pas coder en dur le package de l'application dans la ressource; l’espace de noms spécial http://schemas.Android.com/apk/res-auto , qui permettra aux outils de déterminer le bon espace de noms pour la ressource , quel que soit le résultat réel. paquet utilisé lors de la construction.

2
Jason Rogena

Je pense que vous devriez utiliser

iconview:name="entypo_search"

au lieu de 

iconview:icon_name="entypo_search"
1
GeliteNight

Si quelqu'un est ici et que rien ne semble fonctionner. D'après ce que je peux voir, avoir un trait de soulignement dans votre espace de noms semble bien fonctionner dans l'éditeur, mais se brise de manière inattendue lors de la création de l'application.

0
JamEngulfer