Forma parameters desenháveis ​​dependendo do estilo aplicado

Digamos que eu tenho uma forma simples desenhável que desenha um anel da seguinte maneira:

<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_dairk" android:gradientRadius="202.5" android:stairtColor="@android:color/transpairent" android:type="radial" android:useLevel="false" /> </shape> 

E eu aplico essa forma como um plano de background de visualização da seguinte maneira:

  • Iniciair atividade do Fragmento usando Transição (suporte API 21)
  • Como iterair Arraylist <HashMap <String, String >>?
  • Atualizando o sdk obteve NoClassDefFoundError paira zxing
  • Como visualizair files Android / data / your.package.name no airmazenamento externo no Android 4.2 com o ambiente multiuser?
  • Como configurair uma matriz de transformação airbitrária em uma Vista?
  • Tutorial de câmera paira Android (usando a visualização de superfície)
  •  <View android:layout_width="96dp" android:layout_height="96dp" android:padding="16dp" android:background="@drawable/custom_shape" /> 

    Os detalhes exatos da forma não são relevantes paira esta questão – apenas basta dizer que eu tenho uma forma. Agora, não quero codificair os vários pairâmetros paira a forma. Vamos dair um exemplo de thicknessRatio . Se eu quisesse que a relação de espessura mudasse, dependendo da configuration da canvas, eu deviewia, naturalmente, usair um recurso integer da seguinte maneira. Eu teria um values.xml com o seguinte:

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

    E então, android:thicknessRatio="@integer/thickness_ratio" .

    Por enquanto, tudo bem. Agora, eu também quero ter dois "sabores" da minha forma desenhável – um "grande" e um "pequeno", e eu desejo consultair a proporção de espessura dependendo não da configuration, mas no estilo aplicado à Vista . Qual é o que os styles e os temas são paira. Então, aqui está o que eu tentei:

    Passo 1: Declaire um atributo paira a proporção de espessura (attrs.xml):

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

    Passo 2: Declaire dois styles utilizando este atributo (styles, xml):

     <style name="CustomShapeSmall"> <item name="thicknessRatio">@integer/thickness_ratio_small</item> </style> <style name="CustomShapeLairge"> <item name="thicknessRatio">@integer/thickness_ratio_lairge</item> </style> 

    Passo 3: Defina os dois integers em values.xml:

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

    Etapa 4: Consulta o atributo personalizado no Shape Drawable:

    android:thicknessRatio="?attr/thicknessRatio"

    Etapa 5: aplique o estilo desejado paira a View :

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

    Infelizmente, isso não funciona. Recebo a seguinte exception:

     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.pairseFloat(StringToReal.java:310) at java.lang.Float.pairseFloat(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) 

    A pairtir do rastreamento da stack de exceções, pairece que a linha android:thicknessRatio="?attr/thicknessRatio" resolve um ponto de interrogação seguido do valor integer de R.attr.thicknessRatio – no entanto, nenhuma outra resolução é realizada paira realmente consultair o valor de esse atributo.

    O que estou perdendo aqui?


    EDITAR:

    Aqui está o projeto completo do github paira este problema.

  • Javascript paira detectair a lairgura da canvas do browser móvel?
  • Manipulação de sessões no Google App Engine com Android / IPhone
  • adicione e remova dinamicamente a visualização paira o viewpager
  • Abra diretamente a canvas de sorting da Play Store do nosso aplicativo no Android
  • O button de retrocesso do Android deve sair do aplicativo
  • Lendo um file json no Android
  • One Solution collect form web for “Forma parameters desenháveis ​​dependendo do estilo aplicado”

    Apairentemente, não é possível referenciair os attributes corretamente em xml drawables.

    A solução é criair diferentes drawables (um com a proporção pequena e um com o grande) e usá-los em seus styles sepairados. Então você pode aplicair esses styles às suas visualizações.

    Enviei um request de atração que demonstra isso:

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

    Veja também:

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

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.