2011-04-07 5 views
17

URL/etc와 같은 구성을 사용할 유틸리티 클래스 용 리소스 폴더에 넣으려고합니다. 그러나 나는 모든 곳의 컨텍스트를 전달하고 싶지 않습니다. 컨텍스트를 사용하여 리소스에 액세스하지 않고도 경로 이름을 통해 리소스에 액세스하고 싶습니다 (자산처럼 보이거나이 용도로 설계된 것).컨텍스트없이 리소스에 액세스

이 특별한 경우에, 나는 그것이 인스턴스화 될 때 구성에서 무언가를 사용하기를 원합니다. 인스턴스화하는 동안 한 번 외의 리소스는 필요 없습니다. 따라서 getInstance()가 호출 될 때마다 컨텍스트를 전달해야하는 것은 완전한 낭비입니다.

또한 App의 구성에 따라 다르므로 공유 시스템 파일이나 그와 유사한 항목에 저장하면 안됩니다.

답변

61

사용

Resources.getSystem().getString(android.R.string.someuniversalstuff) 

당신은 심지어 정적 상수 선언에서, 응용 프로그램에서 절대적으로 모든 곳에서 사용할 수 있습니다! 그러나 시스템 리소스에만 해당됩니다.

로컬 리소스의 경우 that solution을 사용하십시오.

+21

** 시스템 리소스 전용 ** – Youngjae

+0

@ 영재 예. 그리고 지역의 경우에는 참조를 따르십시오. – Gangnus

+0

예외가 있습니다. android.content.res.Resources $ NotFoundException : 문자열 리소스 ID – vinidog

1

불행히도 나는이 문제를 해결할 실제 방법이 없다고 생각합니다. 나는 이와 같은 것을 내 놓고, 액티비티 컨텍스트 대신 getApplicationContext()를 전달한다.

public static AppController getAppController(Context context){ 
    if(self == null) { 
     //Create instance 
     self = new AppController(); 
    } 

    return self; 
} 

: 그리고

appController = AppController.getAppController(getApplicationContext()); 
+0

오 잘, 나는 그 해답이 될 거라고 두려워했다. 컨텍스트에서 앱 리소스에만 액세스 할 수있는 것은 매우 나쁜 디자인 인 것 같습니다. 나는 그것을위한 이유가있을 것이라고 확신한다 ... 그러나 그것은 짜증나는 none-the-less이다. 그것을 확인해 주셔서 감사합니다 =) – mnemy

+0

우리 팀과 나는 항상 불평한다. 그것은 결합되지 않은 모듈 코드를 작성하기가 어렵습니다. – sgarman

1

나는 일을 추천 할 것 다음 모든 곳에서 활동 클래스 컨텍스트를 반환하는 공공 기능을 가진 싱글 톤 클래스를 만들어 오히려 상황을 전달하는 대신 :

private static ActivityMain instance; 

초기화 super.onCreate 전에서 onCreate() (내부) :

instance = this; 

그런 다음 사용자의 작업에 이러한 공공 기능을 추가 :

/** Get singleton instance of activity **/ 
public static ActivityMain getInstance() { 
    return instance; 
} 

/** Returns context of this activity **/ 
public static Context getContext(){ 
    return instance.getApplicationContext(); 
} 
,

는 이제 모든 클래스에서 어디를 사용할 수 있습니다 :

Context context = AntiMorphActivity.getContext(); 
String packageName = context.getPackageName(); 
int id = context.getResources().getIdentifier("web_page", "raw", packageName); 
+0

매우 끔찍한 해결책입니다. 이런 식으로 활동을 누설하고 있습니다. –

+2

아니요, 그는 응용 프로그램 컨텍스트를 사용하고 있으므로 활동이 유출되지 않습니다. – Davor

9

당신은 기본 응용 프로그램 클래스를 확장하고 리소스에 액세스가 보편적 도우미를 제공 할 수있다. 응용 프로그램이 호출자 대신 컨텍스트를 제공하므로 컨텍스트에 대한 필요성이 해소됩니다. 응용 프로그램 클래스는 싱글 톤 스타일이며 응용 프로그램의 일부 (서비스 포함)가 실행되는 동안 항상 사용할 수 있어야합니다.

MyApplication.getResources().... 

이에 액세스 할 매니페스트에 사용자 지정 응용 프로그램을 선언해야합니다 :이 제공

public class MyApplication extends Application { 
protected static MyApplication instance; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    instance = this; 
} 

public static Resources getResources() { 
    return instance.getResources(); 
} 
} 

당신은에 액세스 할 수 있습니다.사용자 지정 응용 프로그램을 가정하면 응용 프로그램의 네임 스페이스의 루트에 있습니다

<application 
android:name=".MyApplication" 
... > 
+0

이것을 사용하는 데 잠재적 인 단점이 있습니까? –

관련 문제