2010-09-29 15 views
22

Quando si programma per Android a volte è necessario utilizzare metodi statici. Ma quando provi ad accedere alle tue risorse con un metodo statico con getString(R.string.text), riceverai un errore. Rendendolo statico non funziona.Android: getString (R.string) nel metodo statico

Qualcuno sa un buon modo per aggirare questo? I file di risorse in Android sono molto utili per creare elementi in lingue diverse o apportare modifiche a un testo.

risposta

24

In un modo o nell'altro, avrete bisogno di un Contesto per quello ... Per i metodi statici questo probabilmente significa che è necessario passare lungo un Contesto quando li chiamano.

6

Passare in un'istanza Context (ad esempio Activity) come oggetto parametro al metodo statico. Quindi invoca getString sul parametro.

+0

questa può essere una cattiva idea. Se stai memorizzando riferimenti a contesti potresti causare una perdita di memoria – Falmarri

+6

Cosa ti ha fatto pensare che io suggerisca di memorizzare un riferimento al contesto? –

+0

@Falmarri: puoi sempre usare 'getApplicationContext()', che quindi valida tutta la durata dell'app –

14

Si potrebbe utilizzare Resources.getSystem().getStringArray(android.R.array.done);

+2

Questa è una buona soluzione solo il lato negativo è che è possibile utilizzare solo le risorse di sistema. –

+1

@ serv-inc - Questo non è ciò che dice 'Resources.getSystem()' [documentation] (https://developer.android.com/reference/android/content/res/Resources.html#getSystem()). – aroth

+1

@ serv-inc - Intendo dire che, secondo la documentazione di riferimento di Google, non importa se si importa il pacchetto.R; 'quando si utilizza' Resources.getSystem(). GetStringArray() ', perché' Resources.getSystem() 'restituisce" un oggetto Risorse condivise globali ** che fornisce accesso solo alle risorse di sistema ** ". Il che suggerisce fortemente che @SarenInden è corretto e che il commento di follow-up invierà le persone solo nel percorso sbagliato suggerendo di provare qualcosa che la documentazione ufficiale dice esplicitamente che non funzionerà. – aroth

-2

Un modo è che si può passare al vostro contesto metodo statico. controllo questo fuori funziona sicuramente

Suoni public class {

public static MediaPlayer getSoundTouch(Context context){ 
    return MediaPlayer.create(context, R.raw.touch); 

} 

public static MediaPlayer getSoundLeak(Context context){ 
    return MediaPlayer.create(context, R.raw.leak); 

} 

public static MediaPlayer getSoundFinish(Context context){ 
    return MediaPlayer.create(context, R.raw.finish); 

} 

}

2

Questo è come mi accedere alle risorse da dentro metodi statici. Forse non è l'ideale, ma.

In primo luogo, estendere l'applicazione e impostare un certo campo statico pubblico (s), e creare un metodo per inizializzare loro:

public class MyApp extends Application { 

    // static resources 
    public static String APP_NAME; 

    public static void initResources(Context context) { 
    APP_NAME = context.getResources().getString(R.string.app_name); 
    } 
} 

E nella mia palese io registrare l'applicazione estesa:

<application 
    android:name=".MyApp"/> 

Nella mia attività di avviamento (MainActivity), faccio una chiamata per inizializzare le risorse statiche:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    MyApp.initResources(this); 
} 

Poi ovunque nel progetto, dopo MainActivity.onCreate (Bundle b) è stato eseguito, è possibile chiamare i metodi statici che accedono le risorse statiche specificate:

public static void printAppName() { 
    Log.w("tag", "my app name: " + MyApp.APP_NAME); 
}