2013-12-11 36 views
1

我在Android 4.0上有一個應用程序。它使用PreferenceManager類來 - 除其他外 - 讓用戶指定要顯示的數字的小數位數。在Android中的存儲類中訪問應用程序上下文

mPreferences = PreferenceManager.getDefaultSharedPreferences(this); 

通常我沒有問題獲取應用程序上下文才能訪問偏好管理器。我的問題是我有一個類(讓我們稱之爲Record),它不具有任何具有app上下文的子類;它只是一個存儲類,但它確實有一個「NumDecPlaces」字段。現在,當我從我的應用程序中實例化類時,我只傳入用戶的#dec場所首選項。如果Record可以直接訪問Preference manager,那將會很好。我想我總是可以使用指向創建它的上下文的指針來實例化Record,但是這要記住很多;-)

所以現在記錄子類什麼都沒有。關於我能做些什麼來讓它看到應用上下文的建議?

謝謝!

回答

2

您可以在構造函數中傳遞Context對象。所以每當你嘗試使用該類時,它會要求你通過一個Context對象,然後用它來獲得SharedPreferences

例如,

public Record(Context context) 
{ 
    mContext = context; 

    mPreferences = PreferenceManager.getDefaultSharedPreferences(mContext) 
} 
+0

Yah,這是我對這個問題的第一反應。正如我所提到的,我只是想避免必須「記住」用上下文來實例化。然而,這並不是什麼大不了的事情,而且它在Android開發中的其他地方几乎都會發生,所以我不知道爲什麼我會退縮。 – Chris

+0

是的,你需要在你的構造函數中傳遞'Context'對象或'SharedPrefrences'對象。 – Apoorv

+0

...我真的很抱怨額外的工作。 Eclipse非常善於提醒我。 – Chris

0

您可以執行@Apoorv的建議,或者您可以創建另一個專門存儲應用程序上下文的類。

public class ContextResolver { 

    private static Context context; 

    public static void setContext(Context context) { 
     if (context == null) { 
      throw new IllegalArgumentException("Context must not be null"); 
     } else if (context instanceof android.app.Activity) { 
      context = androidContext.getApplicationContext(); 
     } else if (context instanceof android.content.Context) { 
      context = androidContext; 
     } 
    } 
    public Context getContext() { 
     return context; 
    } 
} 

現在你需要調用setContext()中,將推出一次的第一個活動。

public class MyFirstActivity extends Activity { 
    public void onCreate() { 
     ContextResolver.setContext(this); 
    } 
} 

現在您可以從代碼的任何部分檢索上下文。因此,在您記錄類你可以這樣做:

mPreferences = PreferenceManager.getDefaultSharedPreferences(ContextResolver.getContext()); 
+0

這很有趣。我今晚會嘗試一下,並且與剛剛傳入的上下文選項進行權衡。 – Chris

0

您還可以擴展與應用類,這將是全球性的整個應用程序,你可以設置在類的上下文中的成員變量和上下文將對整個應用程序是全球性的

例如, A級延伸應用{......}

相關問題