我试图在我的dimens.xml文件中添加一个浮点数.
我正在阅读following SO answer.当我尝试解决方案时,我得到了评论中描述的异常.我试图找出抛出异常的原因.
为了完整性,这里是XML:
<item name="zoom_level" format="float" type="dimen">15.0</item>
这是爆炸的代码:
final float zoom = this.getResources().getDimension(R.dimen.zoom_level);
我跳进了Android源代码,这里是getDimension的方法定义:
public float getDimension(int id) throws NotFoundException { synchronized (mTmpValue) { TypedValue value = mTmpValue; getValue(id,value,true); if (value.type == TypedValue.TYPE_DIMENSION) { return TypedValue.complexToDimension(value.data,mMetrics); } throw new NotFoundException( "Resource ID #0x" + Integer.toHexString(id) + " type #0x" + Integer.toHexString(value.type) + " is not valid"); } }
所以无论出于什么原因,value.type!= TypedValue.TYPE_DIMENSION.我没有完全设置我的Android源代码,因此我无法在那里轻松添加Log.w(“YARIAN”,“value type is”value.type)’语句.
然后我跳进了getValue,调用链似乎是:
Resources.getValue -> AssetManager.getResourceValue -> AssetManager.loadResourceValue
loadResourceValue是一个本机方法,这是我的挖掘分崩离析的地方.
有谁知道了解最新情况的最佳方法是什么?
我还注意到Resources有一个TypedValue.TYPE_FLOAT和TypedValue.TYPE_DIMENSION.但在XML中,我不能写type =“float”.
注释中描述的解决方法是使用type = string然后使用Float.parse来获取浮点数.这有必要吗?为什么或者为什么不?
解决方法
我知道这是一个迟到的答案,但你应该使用
TypedValue#getFloat()而不是像你建议的那样将字符串解析为浮点数.
XML:
<item name="float_resource" format="float" type="raw">5.0</item>
Java的:
TypedValue out = new TypedValue(); context.getResources().getValue(R.raw.float_resource,out,true); float floatResource = out.getFloat();
如果您愿意,可以将fraction,raw或string作为类型,这仅对应于R中的资源类.