Android: come posso ottenere una stringa dalle risorse usando il suo nome?


Mi piacerebbe avere 2 lingue per l'interfaccia utente e valori di stringa separati per loro nel mio file di risorse res\values\strings.xml :

<string name="tab_Books_en">Books</string>
<string name="tab_Quotes_en">Quotes</string>
<string name="tab_Questions_en">Questions</string>
<string name="tab_Notes_en">Notes</string>
<string name="tab_Bookmarks_en">Bookmarks</string>

<string name="tab_Books_ru">Книги</string>
<string name="tab_Quotes_ru">Цитаты</string>
<string name="tab_Questions_ru">Вопросы</string>
<string name="tab_Notes_ru">Заметки</string>
<string name="tab_Bookmarks_ru">Закладки</string>

Ora ho bisogno di recuperare questi valori dinamicamente nella mia app:

spec.setContent(R.id.tabPage1);
String pack = getPackageName();
String id = "tab_Books_" + Central.lang;
int i = Central.Res.getIdentifier(id, "string", pack);
String str = Central.Res.getString(i);

Il mio problema è che i = 0 . Questo codice è stato preso da questo link .

Perché non funziona nel mio caso?



Answers



Il collegamento a cui ti riferisci sembra funzionare con le stringhe generate in fase di esecuzione. Le stringhe da strings.xml non vengono create in fase di runtime. Puoi ottenerli via

String mystring = getResources().getString(R.string.mystring);

getResources() è un metodo della classe Context . Se ti trovi all'interno di un'attività o di un Service (che estende il contesto) puoi utilizzarlo come in questo frammento.

Si noti inoltre che l'intera dipendenza della lingua può essere gestita dal framework Android . Crea semplicemente cartelle diverse per ogni lingua. Se l'inglese è la tua lingua predefinita, basta mettere le stringhe inglesi in res/values/strings.xml . Quindi crea una nuova cartella values-ru e metti le stringhe di russo con nomi identici in res/values-ru/strings.xml . Da questo punto in poi Android seleziona quello corretto in base alle getString() locali del dispositivo, quando chiamate getString() o quando getString() riferimento a stringhe in XML tramite @string/mystring . Quelli da res/values/strings.xml sono quelli di fallback, se non hai una cartella che copra le impostazioni locali degli utenti, questa sarà usata come valori di default.

Vedi Localizzazione e fornitura di risorse per ulteriori informazioni.




Ho lo stesso problema. Ma questo codice qui sotto funziona per me: verifica se il tuo packageName è corretto. Devi fare riferimento per il pacchetto radice della tua applicazione Android.

private String getStringResourceByName(String aString) {
      String packageName = getPackageName();
      int resId = getResources().getIdentifier(aString, "string", packageName);
      return getString(resId);
    }



Non solo dalle attività:

    public static String byIdName(Context context, String name) {
        Resources res = context.getResources();
        return res.getString(res.getIdentifier(name, "string", context.getPackageName()));
    }



getResources().getString(getResources().getIdentifier("propertyName", "string", getPackageName()))



Vorrei aggiungere qualcosa alla soluzione di leonvian, quindi se per caso la stringa non viene trovata tra le risorse (valore restituito 0, che non è un codice risorsa valido), la funzione potrebbe restituire qualcosa:

private String getStringResourceByName(String aString) {
    String packageName = getPackageName();
    int resId = getResources()
            .getIdentifier(aString, "string", packageName);
    if (resId == 0) {
        return aString;
    } else {
        return getString(resId);
    }
}






Se non si dispone di un riferimento attività, è possibile utilizzare il contesto in questo modo:

getContext().getString(R.string.your_string_name);



C'è anche un set di stringhe Android predefinite come "Ok", "Annulla" e molte altre - quindi non devi dichiarare tutto. Sono disponibili semplicemente da:

getString(android.R.string.ok)

(In questo caso, stringa "Ok"). A proposito ci sono anche altre risorse Android disponibili come ad esempio immagini di icone ecc.




Resources res = getResources();
String text = String.format(res.getString(R.string.welcome_messages), username, mailCount);



Un modo semplice per ottenere l'ID risorsa dalla stringa. Qui resourceName è il nome della risorsa ImageView nella cartella drawable che è inclusa anche nel file XML.

int resID = getResources().getIdentifier(resourceName, "id", getPackageName());
    ImageView im = (ImageView) findViewById(resID);
    Context context = im.getContext();
    int id = context.getResources().getIdentifier(resourceName, "drawable",
    context.getPackageName());
    im.setImageResource(id);