Using Android getIdentifier()

JavaAndroid

Java Problem Overview


I've tried this:

r = Resources.getSystem().getIdentifier("ball_red","drawable","com.Juggle2");
Log.i("FindBall","R = "+r);

And this:

r = Resources.getSystem().getIdentifier("com.Juggle2:drawable/ball_red", null, null);

But 'r' always ends up as zero.

I'm calling this line from inside a helper class that's not an Activity and doesn't extend anything, so I can't simply call getResources(), but I can pass it from my SurfaceView.

Eventually, I want to replace "ball_red" with a variable, but first thing's first. This isn't working.

com.Juggle2 is indeed my package name. drawable is the res folder that it's in, and, the name of the file is indeed ball_red.

R.java says:

        public static final int ball_red=0x7f020027;

So I'm not sure why it isn't working.


So I can't use Resources, I must pass a context, and I'm doing that this way: Inside here:

class Collection extends SurfaceView implements SurfaceHolder.Callback {

I'm making a new instance of my class and passing it getContext() as a parameter.

Java Solutions


Solution 1 - Java

Since you are inside of an activity it is enough to write

int resId = YourActivity.this.getResources().getIdentifier(
    "ball_red",
    "drawable",
    YourActivity.this.getPackageName()
);

or if you're not calling it from an inner class

int resourceID = getResources().getIdentifier(
    "ball_red",
    "drawable",
    getPackageName()
);

Note

getIdentifier() Returns 0 if no such resource was found. (0 is not a valid resource ID.)

Check

Check also in your R.java whether there is a drawable with the name ball_red

e.g.:

public static final class drawable {
        public static final int ball_red = 0x7f020000;
 }

EDIT If you're not in any activity then you must pass a context instead of resources as parameter then do this

int resId = context.getResources().getIdentifier(
    "ball_red",
    "drawable",
    context.getPackageName()
);

Solution 2 - Java

For Xamarin users I had the issue where I had added an icon with lower and uppercase letters (e.g. iconVaccine.png ) and was referring to the uppercase name iconVaccine.

Xamarin will allow you to do this (even though you shouldn't), but when the app gets compiled the name are flattened to lower case, so you must refer to the lower case variant as follows:

Image Name: iconVaccine.png

Xamarin reference: iconVaccine (as created in Resource.designer.cs, but will fail)

Correct Reference: iconvaccine

Hope that helps!

Solution 3 - Java

Though the answer from Festus Tamakloe is correct I found a quirk in this function.

If you are declaring a string-array in a xml file it must be accessed by calling the base resource type array, using string-array results in anid 0 return.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser773737View Question on Stackoverflow
Solution 1 - JavaFestus TamakloeView Answer on Stackoverflow
Solution 2 - JavaCraig ChampionView Answer on Stackoverflow
Solution 3 - JavaEinar SundgrenView Answer on Stackoverflow