2016-01-22 10 views
5

Mam ciąg xml w moim values/strings.xml plikuJak przekonwertować ciąg do jego ID zasobu (Android Studio)

<string name="pokemon_d">150</string> 

I mam String "150" w moim kontrolera MainActivity.java. W moim MainActivity, w jaki sposób mogę przekonwertować ten String na identyfikator zasobu pokemon_d String w pliku xml? Czy to możliwe?

+0

co masz na myśli, przekształcając ciąg zasobów? nawrócić na co? – AndroidMechanic

+3

Powróćmy o krok: co doprowadziło do tego pytania, tj. Co naprawdę chcesz osiągnąć? – Henry

Odpowiedz

6

Nie można uzyskać identyfikator przez wartość, ale można zrobić swoją nazwę identyfikatora wyglądać wartości i dostać go z nazwy strun

Więc co sugeruję,

używać nazwy zasobu String coś podobnego , resource_150

<string name="resource_150">150</string>

teraz tutaj resource_ jest wspólny dla swoich wpisów smyczkowy string.xml pliku, więc w swojej Kod,

String value = "150"; 
int resourceId = this.getResources(). 
      getIdentifier("resource_"+value, "string", this.getPackageName()); 

Teraz resourceId wartość jest równoważna R.string.resource_150

Tylko upewnij się tutaj this reprezentować swój kontekst aplikacji. W twoim przypadku zadziała MainActivity.this.

+0

Ups, moje złe, tęskniłem za tym. Dzięki. – user370305

+1

To zadziałało! Dzięki – gciluffo

1

Identyfikator zasobu jest R.string.pokemon_d

nie wierzę, można wyszukać identyfikator zasobów przez wartość ciągu. Możesz utworzyć Mapę wartości i ustawić ją tak, aby klucz był wartością, a wartość mapy jest twoim identyfikatorem res, gdybyś mógł to sprawdzić samodzielnie, ale nie jestem nawet pewien, dlaczego byłaby przydatna.

0

znalazłem kilka wskazówek tutaj: Android, getting resource ID from string?

Poniżej przykład jak uzyskać ciągi i ich wartości określonych w strings.xml. Jedyne, co musisz zrobić, to zrobić pętlę i przetestować łańcuch, który trzyma twoją wartość. Jeśli chcesz powtórzyć to wielokrotnie, lepiej zbudować tablicę. // ---------

String strField = ""; 
    int resourceId = -1; 
    String sClassName = getPackageName() + ".R$string"; 
    try { 
     Class classToInvestigate = Class.forName(sClassName); 

     Field fields[] = classToInvestigate.getDeclaredFields(); 

     strField = fields[0].getName();  
     resourceId = getResourceId(strField,"string",getPackageName()); 

     String test = getResources().getString(resourceId); 

     Toast.makeText(this, 
         "Field: " + strField + " value: " + test , 
         Toast.LENGTH_SHORT).show(); 


    } catch (ClassNotFoundException e) { 
      Toast.makeText(this, 
         "Class not found" , 
         Toast.LENGTH_SHORT).show(); 
    } catch (Exception e) { 
     Toast.makeText(this, 
         "Error: " + e.getMessage() , 
         Toast.LENGTH_SHORT).show(); 
    } 


} 
public int getResourceId(String pVariableName, String pResourcename, String pPackageName) 
{ 
    try { 
     return getResources().getIdentifier(pVariableName, pResourcename, pPackageName); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return -1; 
    } 
} 
Powiązane problemy