Forme Paramètres déplaçables selon le style appliqué

Disons que j'ai une forme simple dessinable qui dessine un anneau comme suit:

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:dither="true" android:innerRadiusRatio="3" android:shape="ring" android:thicknessRatio="36" android:useLevel="false" > <gradient android:centerColor="@android:color/holo_blue_bright" android:centerY="0.001" android:endColor="@android:color/holo_blue_dark" android:gradientRadius="202.5" android:startColor="@android:color/transparent" android:type="radial" android:useLevel="false" /> </shape> 

Et j'applique cette forme comme fond d'écran comme suit:

 <View android:layout_width="96dp" android:layout_height="96dp" android:padding="16dp" android:background="@drawable/custom_shape" /> 

Les détails exacts de la forme ne sont pas pertinents pour cette question – suffit de dire que j'ai une forme. Maintenant, je ne veux pas coder les différents paramètres de la forme. Prenons l' thicknessRatio comme exemple. Si je voulais que le ratio d'épaisseur change en fonction de la configuration d'écran, j'utiliserais naturellement une ressource entière comme suit. J'aurais un values.xml avec ce qui suit:

<item name="thickness_ratio" type="integer" format="integer">56</item>

Et puis, android:thicknessRatio="@integer/thickness_ratio" .

Jusqu'ici tout va bien. Maintenant, je veux aussi avoir deux "saveurs" de ma forme dessinables – une "grande" et une "petite", et je souhaite interroger le ratio d'épaisseur en fonction non pas de la configuration, mais sur le style appliqué à la vue . À quoi servent les styles et les thèmes. Donc, voici ce que j'ai essayé:

Étape 1: déclarez un attribut pour le ratio d'épaisseur (attrs.xml):

 <resources> <attr name="thicknessRatio" format="reference" /> </resources> 

Étape 2: déclarez deux styles en utilisant cet attribut (styles, xml):

 <style name="CustomShapeSmall"> <item name="thicknessRatio">@integer/thickness_ratio_small</item> </style> <style name="CustomShapeLarge"> <item name="thicknessRatio">@integer/thickness_ratio_large</item> </style> 

Étape 3: définissez les deux entiers dans values.xml:

 <item name="thickness_ratio_small" type="integer" format="integer">32</item> <item name="thickness_ratio_large" type="integer" format="integer">56</item> 

Étape 4: recherchez l'attribut personnalisé dans la forme dessicable:

android:thicknessRatio="?attr/thicknessRatio"

Étape 5: appliquez le style souhaité à la View :

 <View android:layout_width="96dp" android:layout_height="96dp" android:padding="16dp" style="@style/CustomShapeSmall" android:background="@drawable/custom_shape" /> 

Malheureusement, cela ne fonctionne pas. Je reçois l'exception suivante:

 Caused by: android.content.res.Resources$NotFoundException: File res/drawable/custom_shape.xml from drawable resource ID #0x7f020000 at android.content.res.Resources.loadDrawable(Resources.java:2091) at android.content.res.TypedArray.getDrawable(TypedArray.java:601) at android.view.View.<init>(View.java:3364) at android.view.View.<init>(View.java:3293) ... 28 more Caused by: java.lang.NumberFormatException: Invalid float: "?2130771969" at java.lang.StringToReal.invalidReal(StringToReal.java:63) at java.lang.StringToReal.parseFloat(StringToReal.java:310) at java.lang.Float.parseFloat(Float.java:300) at android.content.res.TypedArray.getFloat(TypedArray.java:287) at android.graphics.drawable.GradientDrawable.inflate(GradientDrawable.java:827) at android.graphics.drawable.Drawable.createFromXmlInner(Drawable.java:901) at android.graphics.drawable.Drawable.createFromXml(Drawable.java:837) at android.content.res.Resources.loadDrawable(Resources.java:2087) 

À partir de la trace de la pile d'exception, il semble que la ligne android:thicknessRatio="?attr/thicknessRatio" résout un point d'interrogation suivi de la valeur entière de R.attr.thicknessRatio – mais aucune autre résolution n'est effectuée pour effectivement interroger la valeur de Cet attribut.

Qu'est-ce que j'oublie ici?


MODIFIER:

Voici le projet github complet pour ce problème.

  • Le thème Android XML héritant de deux thèmes parents?
  • Couleur d'arrière-plan personnalisée pour l'élément sélectionné avec le tiroir de navigation "activé"
  • Quelles sont les valeurs de couleur par défaut pour le thème Holo sur Android 4.0?
  • Style de boîte de dialogue personnalisé dans la boîte de dialogue
  • Changer le clavier Android L entrer la couleur de la clé
  • Android Holo Selected List Élément Couleur
  • Comment faire des applications belles et élégantes comme Timely
  • Android: comment modifier la couleur de texte de ProgressDialog?
  • One Solution collect form web for “Forme Paramètres déplaçables selon le style appliqué”

    Apparemment, il n'est pas possible de référencer correctement les attributs dans les modèles xml.

    La solution de contournement consiste à créer différents modèles (un avec le petit ratio et l'un avec le grand) et utilisez ceux-ci dans vos styles distincts. Ensuite, vous pouvez appliquer ces styles à vos points de vue.

    Je vous ai envoyé une demande de tirage qui démontre ceci:

    https://github.com/curioustechizen/so-question-android-custom-styles/pull/1

    regarde aussi:

    https://stackoverflow.com/a/13471695/1369222

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.