假设我有一个简单的形状可绘制,如下所示绘制一个环:
<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>
我将此形状应用为视图背景,如下所示:
<View
android:layout_width="96dp"
android:layout_height="96dp"
android:padding="16dp"
android:background="@drawable/custom_shape" />
形状的确切细节与这个问题无关 - 只要说我有一个形状就足够了。现在,我不想硬编码形状的各种参数。我们以thicknessRatio
为例。如果我想根据屏幕配置改变厚度比,我当然会使用整数资源,如下所示。我有一个带有以下内容的values.xml:
<item name="thickness_ratio" type="integer" format="integer">56</item>
然后,android:thicknessRatio="@integer/thickness_ratio"
。
到目前为止,这么好。现在,我也希望我的形状有两种“味道” - 一个“大”和一个“小”,我希望查询厚度比,不是取决于配置,而是取决于应用的样式到视图。这是什么样式和主题。所以,这就是我的尝试:
<resources>
<attr name="thicknessRatio" format="reference" />
</resources>
<style name="CustomShapeSmall">
<item name="thicknessRatio">@integer/thickness_ratio_small</item>
</style>
<style name="CustomShapeLarge">
<item name="thicknessRatio">@integer/thickness_ratio_large</item>
</style>
<item name="thickness_ratio_small" type="integer" format="integer">32</item>
<item name="thickness_ratio_large" type="integer" format="integer">56</item>
android:thicknessRatio="?attr/thicknessRatio"
View
:<View
android:layout_width="96dp"
android:layout_height="96dp"
android:padding="16dp"
style="@style/CustomShapeSmall"
android:background="@drawable/custom_shape" />
不幸的是,这不起作用。我得到以下异常:
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)
从异常堆栈跟踪中,似乎行android:thicknessRatio="?attr/thicknessRatio"
解析为问号后跟整数值R.attr.thicknessRatio
- 但是没有进一步解析来实际查询此属性的值
我在这里缺少什么?
Here是此问题的完整github项目。
答案 0 :(得分:6)
显然,无法正确引用xml drawable中的属性。
解决方法是创建不同的drawable(一个具有较小的比例,一个具有较大的比例)并在您的单独样式中使用它们。然后,您可以将这些样式应用于您的视图。
我已经向您发送了拉取请求,证明了这一点:
https://github.com/curioustechizen/so-question-android-custom-styles/pull/1
另见: