GendoIkari
GendoIkari

Reputation: 11914

Resources.getIdentifier() has unexpected behavior when name is numeric

I use Resources.getIdentifier to load up string resources dynamically; because I am dynamically passed a string that needs to be translated from my resources files. It returns 0 when the resource doesn't exist; so I handle that. However, when I pass in a string that is a numeric; even though I don't have that defined in my resources, it returns the number I passed in instead of 0. This causes a crash when I try to get that resource.

int identifier = context.getResources().getIdentifier(myText, "string", "com.farragut.android.emsspeak");
if (identifier > 0) {
    text2.setVisibility(View.VISIBLE);
    text2.setText(context.getResources().getString(identifier));
} else {
    text2.setVisibility(View.GONE);
}

Is this defined behavior?? I can't imagine why it works fine when myText is "BLAH" but then when myText is "12" it is different. The only thing I can think of is to test if myText is numeric first; though the only way I can find to do that is to try to parse it as an integer and catch a numberFormatException. Is that the best solution?

Upvotes: 1

Views: 3893

Answers (3)

NiTiN
NiTiN

Reputation: 1022

I was banging my head to make this work:

int imgId = getResources().getIdentifier("moviedetails" + movieId , "drawable", getPackageName());
imageview.setImageResource(imgId);

works perfectly fine for me. just needed : "Project --> Clean"

Upvotes: 0

Sunil Kumar Sahoo
Sunil Kumar Sahoo

Reputation: 53657

String resource can contain only strings no special characters no alphabets as tag name.

example

<string name="mydata">Suuuuu</string> is valid

<string name="45645">Suuuuu</string> is invalid

so first check whether your text is valid or not

Use the following code to get it work for you

Code

boolean isValid = (Pattern.matches("[a-zA-Z]+", myText))

if(isValid){
int identifier = context.getResources().getIdentifier(myText, "string", "com.farragut.android.emsspeak");
if (identifier > 0) {
    text2.setVisibility(View.VISIBLE);
    text2.setText(context.getResources().getString(identifier));
} else {
    text2.setVisibility(View.GONE);
}

}

Thanks Deepak

Upvotes: 0

iDroid
iDroid

Reputation: 10533

Well this is kinda weird but if I specify the fully qualified name like it's mentioned in the getIdentifier() documentation it works properly otherwise i got the same result like you.

Try it with getIdentifier("com.farragut.android.emsspeak:string/"+myText, null, null);

Upvotes: 7

Related Questions