2010-09-29 10 views
22

Podczas programowania dla Androida czasami trzeba użyć metod statycznych. Ale kiedy spróbujesz uzyskać dostęp do zasobów w statycznej metodzie z getString(R.string.text), dostaniesz błąd. Uczynienie go statycznym nie działa.Android: getString (R.string) w metodzie statycznej

Czy ktoś wie o tym dobrze? Pliki zasobów w systemie Android są bardzo pomocne przy tworzeniu rzeczy w różnych językach lub wprowadzaniu zmian w tekście.

Odpowiedz

24

Tak czy inaczej, będziesz potrzebował Kontekstu dla tego ... W przypadku metod statycznych prawdopodobnie oznacza to, że musisz przekazywać Kontekst podczas ich wywoływania.

6

Przepuścić instancję Context (tj. Activity) jako obiekt parametru do metody statycznej. Następnie wywołaj parametr getString.

+0

można to zły pomysł. Jeśli przechowujesz odniesienia do kontekstów, możesz spowodować wyciek pamięci – Falmarri

+6

Co spowodowało, że uważasz, że proponuję zapisać odniesienie do kontekstu? –

+0

@Falmarri: zawsze możesz użyć 'getApplicationContext()', co wtedy poprawiłoby cały czas życia całej aplikacji –

14

Można użyć Resources.getSystem().getStringArray(android.R.array.done);

+2

To dobre rozwiązanie, wadą jest to, że można używać tylko zasobów systemowych. –

+1

@ serv-inc - To nie jest to, co mówi 'Resources.getSystem()' [documentation] (https://developer.android.com/reference/android/content/res/Resources.html#getSystem()). – aroth

+1

@ serv-inc - mam na myśli to, że zgodnie z dokumentacją referencyjną Google, nie ma znaczenia, czy "importujesz swój pakiet.R; 'przy użyciu' Resources.getSystem(). GetStringArray() ', ponieważ' Resources.getSystem() 'zwraca" globalny udostępniony obiekt zasobów **, który zapewnia dostęp tylko do zasobów systemowych ** ". Co mocno sugeruje, że @SarenInden jest poprawny i że kolejny komentarz wyśle ​​ludzi tylko po niewłaściwej ścieżce, sugerując, że spróbują czegoś, co oficjalna dokumentacja wyraźnie nie będzie działać. – aroth

-2

Jednym ze sposobów jest kontekst można przekazać do metody statycznej. check out to na pewno działa

public class Sounds {

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

ten sposób mogę uzyskać dostęp do zasobów z wewnątrz metod statycznych. Może nie idealnie, ale.

Po pierwsze, rozszerzenie stosowania i ustawić jakąś publiczną pole statyczne (S) i utworzyć metodę, aby je zainicjować:

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

I w moim manifestu zarejestrować rozszerzony Zastosowanie:

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

W mojej aktywności początkowej (MainActivity) wykonuję połączenie inicjujące statyczne zasoby:

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

Następnie wszędzie w projekcie, po MainActivity.onCreate (Bundle b) prowadzi, można wywołać metody statyczne, które uzyskują dostęp do swoich określonych zasobów statycznych:

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