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>
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"
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
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.
Je pense que vous devriez utiliser
iconview:name="entypo_search"
au lieu de
iconview:icon_name="entypo_search"
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.