2013-03-27 3 views
4

Я пытаюсь добавить float в свой файл 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, чтобы получить поплавок. Это необходимо? Почему или почему нет?

ответ

13

Я знаю, что это поздний ответ, но вы должны использовать TypedValue#getFloat() вместо того, чтобы разыгрывать String в поплавок, как вы предполагали.

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 как type, если вы предпочитаете, это соответствует только классу ресурсов в R.

+1

Это должен быть принятый ответ – Peter

+0

Итак, где же этот XML должен идти? Размер xml в res/raw? –

+0

@ G_V Да, я так думаю - хотя я не думаю, что это действительно имеет значение, поскольку все это подхватывает 'R'? – Rich

Смежные вопросы