2016-07-15 258 views
2

我在SharedPreferences中通過SettingsHelper類設置一個字符串,如下所示。我已經通過在設置後立即獲取字符串來驗證它實際上已被設置。SharedPreferences值在新實例後返回null

創建了SettingsHelper類的新實例。

然後我試圖檢索字符串我設置,但它出現null。

可以getName返回null,因爲我創建了SettingsHelper類的新實例?

public class SettingsHelper extends Application { 

    private static Context context; 
    Context ctx; 

    public void onCreate() { 
     super.onCreate(); 
     context = getApplicationContext(); 
     ctx = context; 
    } 

    public static Context getAppContext() { 
     return context; 
    } 

public SettingsHelper() { 
     this.ctx = context; 
    } 


public String getName() { 
     return PreferenceManager.getDefaultSharedPreferences(ctx).getString("myKey", "null"); 
    } 

    public void setName(String name) { 
     PreferenceManager.getDefaultSharedPreferences(ctx).edit().putString("myKey", name).commit(); 
    } 
} 

活動A

SettingsHelper settingsHelper = new SettingsHelper(); 
settingsHelper.setName("John"); 

B類

SettingsHelper settingsHelper = new SettingsHelper(); 
    settingsHelper.getName(); //null 
+0

你有沒有真的開始活動A? –

+0

是的。我已經驗證該名稱已在活動A中設置。 – HappyPoofySquirrel

回答

2

嘗試轉換方法來靜態方法:

public class SettingsHelper { 

public static String getName(Context ctx) { 
     return PreferenceManager.getDefaultSharedPreferences(ctx).getString("myKey", "An error occured loading name"); 
    } 

    public static void setName(String name, Context ctx) { 
     PreferenceManager.getDefaultSharedPreferences(ctx).edit().putString("myKey", name).commit(); 
    } 
} 

用於調用(來自活動)。

getName(this); 

setName("Namey McNameface", this); 

這樣,你並不需要的情況下,它只是調用SettingsHelper.setName /的getName:如果是外面的活動具有上下文替換此。

編輯

記住ASIGN字符串:

SettingsHelper settingsHelper = new SettingsHelper(); 
String stringHandler = settingsHelper.GetName(); 
//handle string 

編輯#2

注意!

擴展應用程序不是像這樣的類的好主意。刪除'擴展應用程序'。

這有什麼關係?延伸活性

類是對於必須保持運行的整個時間任務和它們在正常FASION(類C =新類)

類擴展應用初始化通過初始化通過編寫android:name=".MyClass"表明。這些類用於:

  • 初始化並在啓動時處理火力地堡
  • 初始化和處理ACRA
  • 初始化和處理重要的事情一樣的權限(如果你覺得檢查他們瞬間

因此,擴展應用程序的類不適用於普通類,因此我建議您按照上面的方法進行操作。另外,因爲您多次創建它,所以我認爲Context = null

我編輯上面的代碼,然後再試一次,看看它是否工作

+0

可否getName返回null,因爲我創建了新實例?我打算靜態(最後的手段)或使用依賴注入來解決問題,如果是這樣的話。 – HappyPoofySquirrel

+0

我不認爲它返回null實例 –

+0

它不應該在理論上,但你可以嘗試上面的代碼,看看它是否可以解決問題 – Zoe

1

你推廣應用類 - 這是錯的(或者,至少 - 你正在做它可能在錯誤的方式。

如果你想擴展Application類,你還必須在清單中聲明它爲Application。然後 - 當你每次創建新的上下文時,都不應該使用新的SettingsHelper()創建它,所以可能 - 每次都創建新的首選項文件。另一方面,這個類的onCreate()方法永遠不會被調用,因爲它不是由系統管理的。

在我看來,更好的方法是將此幫助器切換到Object子類,並在構造器中傳遞上下文。

+0

要試試這個。謝謝 – HappyPoofySquirrel

0

務必從活動開始一個一個的活動與此代碼

SettingsHelper settingsHelper = new SettingsHelper(); 
settingsHelper.setName("John"); 

然後,轉到活動爲B調用此:

SettingsHelper settingsHelper = new SettingsHelper(); 
    String stringHandler = settingsHelper.GetName(); 
0

我的問題變成了無關係。我用 「==」 的相關拿到鑰匙,而不是.equals()

if(name == "name"){ 
System.out.print(true); 
} 
else{ 
System.out.print(false); 
} 

的代碼應該使用.equals()不是 「==」 字符串