2011-04-07 93 views
17

我試圖把URLs/etc等配置放入工具類的資源文件夾中使用。但是,我不想從各地的活動中傳遞語境。我希望能夠通過路徑名稱訪問資源(看起來像assets /專爲此目的而設計),而不使用上下文來訪問資源。訪問沒有上下文的資源

在這種特殊情況下,我想要一個單例在實例化時在配置中使用某些東西。在實例化過程中除了那一次之外,它不需要任何資源。因此,每次調用getInstance()時都必須傳遞一個Context,這完全是浪費。

此外,這是特定於應用程序的配置,不應該存儲在共享系統文件或類似的東西。

回答

61

使用

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

你可以在你的應用程序ABSOLUTELY任何地方使用它,即使是在靜態常量聲明!但僅限於系統資源。

對於本地資源使用that solution

+21

**但僅限系統資源。** – Youngjae 2015-11-18 14:40:13

+0

@Youngjae yes。對於本地人來說,請參考參考資料。 – Gangnus 2015-11-19 00:07:25

+0

我得到一個異常:android.content.res.Resources $ NotFoundException:字符串資源ID – vinidog 2016-05-29 18:50:33

1

不幸的是,我不認爲有一個真正的解決方法。我把這樣的東西放在這裏,並且傳入getApplicationContext()而不是活動上下文。

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

    return self; 
} 

然後:

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

喔好,我很害怕,將是答案。這似乎是非常糟糕的設計,只能從上下文訪問應用程序資源。我相信這是有原因的......但這很惱人。感謝您的確認=) – mnemy 2011-04-07 00:50:49

+0

我和我的團隊一直抱怨。這使得編寫非耦合模塊化代碼變得很困難。 – sgarman 2011-04-07 01:18:27

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

非常可怕的解決方案。你正在以這種方式泄露你的活動。 – 2012-12-12 14:09:07

+2

不,他正在使用應用程序上下文,因此活動不會泄露。 – Davor 2013-01-13 12:09:40

9

你可以擴展主應用程序類,並提供通用的助手那裏訪問資源。這減輕了對上下文的需求,因爲應用程序將提供上下文而不是調用者。應用程序類是單例風格的,並且應用程序的任何部分都在運行時(包括服務)應始終可用。

public class MyApplication extends Application { 
protected static MyApplication instance; 

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

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

這將使您能夠訪問:

MyApplication.getResources().... 

一定要在你的清單申報您的自定義應用程序來訪問此。假設您的自定義應用程序是在應用程序的命名空間的根:

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

使用這個有什麼潛在的缺點嗎? – 2017-11-12 00:35:59