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.

  • Thème différent pour différentes versions de SDK Android
  • Pas de titre Bar Theme Theme
  • Comment puis-je obtenir la couleur d'arrière-plan de la barre d'action du thème actuel?
  • Texte AndroidAllCaps dans Theme
  • Définissez les couleurs par défaut sur la bibliothèque Android
  • Android Holo Selected List Élément Couleur
  • Android: changement de couleur de la barre d'état pour le niveau API inférieur à 21
  • Couleurs dépendantes de l'objet des widgets sélectionnés
  • 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.