risposta-alla-domanda-sullo-sviluppo-web-bd.com

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.

Perché non funziona nel mio caso?

471
Ivan

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

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

getResources() è un metodo della classe Context. Se ci si trova in un Activity o un Service (che estende Context) è possibile utilizzarlo come in questo snippet.

Inoltre si noti che l'intera dipendenza linguistica può essere gestita dal framework Android. Crea semplicemente cartelle diverse per ogni lingua. Se l'inglese è la tua lingua predefinita, inserisci le stringhe in res/values/strings.xml. Quindi crea una nuova cartella values-ru e inserisci le stringhe russe con nomi identici in res/values-ru/strings.xml. Da questo punto in poi Android seleziona quello corretto in base alle impostazioni locali del dispositivo, sia quando chiami getString() o quando fai riferimento a stringhe in XML tramite @string/mystring. Quelle di res/values/strings.xml sono quelle di fallback, se non hai un cartella che copre le impostazioni locali dell'utente, questa verrà utilizzata come valori predefiniti.

Vedi Localizzazione e Fornire risorse per ulteriori informazioni.

936
user658042

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);
    }
284
leonvian

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()));
    }
62
konmik
getResources().getString(getResources().getIdentifier("propertyName", "string", getPackageName()))
37
TOUDIdel

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);
    }
}
25
Miguel Rivero

Il modo più semplice è utilizzare la funzione getString() all'interno dell'attività.

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

Riferimento: http://developer.Android.com/guide/topics/resources/string-resource.html

Penso che questa funzionalità sia stata aggiunta in una recente versione di Android, chiunque conosca la cronologia può commentarlo.

13
Eren Yilmaz

Un modo semplice per ottenere una stringa di risorse da una stringa a TextView. Qui resourceName è il nome della risorsa 

int resID = getResources().getIdentifier(resourceName, "string", getPackageName());
textview.setText(resID);
8
Muhammad Adil

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

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

Miglior approccio

App.getRes().getString(R.string.some_id) 

Funzionerà ovunque (Utils, Modelli anche).

Ho letto tutte le risposte, tutte le risposte possono fare il tuo lavoro. 

  • Puoi usare getString(R.string.some_string_id) inActivityoFragment.
  • Puoi usare Context.getString(R.string.some_string_id) dove non hai accesso diretto al metodo getString(). Mi piace Dialog.

Problema

Quando non hai accesso Context, come un metodo nella tua classe Util.

Assumi di seguito il metodo senza contesto.

public void someMethod(){
    ...
    // can't use getResource() or getString() without Context.
}

Ora passerai Context come parametro in questo metodo e userai getString().

public void someMethod(Context context){
    ...
    context.getString(R.string.some_id);
}

Quello che faccio è  

public void someMethod(){
    ...
    App.getAppResources().getString(R.string.some_id)
}

Che cosa? È molto semplice da usare ovunque nella tua app!

Quindi ecco una soluzione con la quale è possibile accedere alle risorse da qualsiasi luogo come Util class.

import Android.app.Application;
import Android.content.res.Resources;

public class App extends Application {
    private static Resources resources;

    @Override
    public void onCreate() {
        super.onCreate();

        resources = getResources();
    }

    public static Resources getAppResources() {
        return resources;
    }

}

Aggiungi il campo nome al tuo tag manifest.xml<application.

<application
        Android:name=".App"
        ...
        >
        ...
    </application>

Ora sei a posto. Utilizza App.getAppResources().getString(R.string.some_id) ovunque nell'app.

5
Khemraj

C'è anche un insieme 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.

4
forsberg

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

modo semplice

1
Avinash

Per sicurezza, è necessario aggiungere: MContext.getResources (). GetString (R.string.your_string);

mContext può essere: contesto in onAttach () di Fragment o this of Activity.

0
O Thạnh Ldt