ファイルにfloatを追加しようとしていdimens.xml
ます。
私は次のSOの答えを読んでいました。解決策を試したところ、コメントに記載されている例外が発生しました。その例外がスローされる理由を理解しようとしています。
完全を期すために、ここに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
があることに気づきました。しかし、XMLでは書くことができません。TypedValue.TYPE_FLOAT
TypedValue.TYPE_DIMENSION
type="float"
コメントで説明されている回避策は、を使用してからtype=string
、を使用Float.parse
してフロートを取得することです。これは必要ですか?なぜまたはなぜそうではないのですか?