Я пытаюсь добавить в свой 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
имеет TypedValue.TYPE_FLOAT
и TypedValue.TYPE_DIMENSION
. Но в XML я не могу писать type="float"
.
Обход, описанный в комментариях, заключается в использовании type=string
, а затем Float.parse
для получения числа с плавающей запятой. Это необходимо? Почему или почему нет?