Resources$NotFoundException: resource ID not valid. Why?

Refresh

December 2018

Views

3.5k time

7

I am trying to add a float to my dimens.xml file.

I was reading the following SO answer. When I tried the solution, I got the exception described in the comments. I am trying to figure out why that exception is thrown.

For completeness here is the XML:

<item name="zoom_level" format="float" type="dimen">15.0</item>

Here is the code that blows up:

final float zoom = this.getResources().getDimension(R.dimen.zoom_level);

I jumped into the Android source, and here is the method definition for 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");
    }
}

So for whatever reason value.type != TypedValue.TYPE_DIMENSION. I do not have my Android source completely set up so I cannot easily add a Log.w("YARIAN", "value type is " + value.type)' statement in there.

I then jumped into getValue and the chain of calls seems to be:

Resources.getValue -> AssetManager.getResourceValue -> AssetManager.loadResourceValue

loadResourceValue is a native method and here is where my digging falls apart.

Anybody know what the best way to understand what's going is?


I also noticed that Resources has a TypedValue.TYPE_FLOAT and TypedValue.TYPE_DIMENSION. But in XML, I cannot write type="float".

The work around described in the comments is to use type=string and then use Float.parse to get the float. Is this necessary? Why or why not?

2 answers

2

Я просто столкнулся с этой проблемой тоже, и хотя сообщение об ошибке не слишком полезно, я понял, что моя проблема заключалась в том, что я надевал только значение с плавающей точкой в ​​моем файле ресурсов и не указал измерение. Переключение 15,0 до 15.0dp, например, позволит избежать этой проблемы и позволит вам по-прежнему использовать обычный размер ресурса.

15

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

XML:

    <item name="float_resource" format="float" type="raw">5.0</item>

Джава:

TypedValue out = new TypedValue();
context.getResources().getValue(R.raw.float_resource, out, true);
float floatResource = out.getFloat();

Вы можете поставить fraction, rawили stringкак typeесли вы предпочитаете, это соответствует только классу ресурсов в R.