2013-10-07 198 views
0

基本上我想設置一個類來讓getter和setter對設備存儲和檢索數據以及其他類來訪問它。我設法讓sharedpreferences在一個類中工作,但在兩個類中遇到問題(我熟悉Java但不熟悉Android,我在某處閱讀我不應該使用Activity而是使用靜態方法,但無法使其工作)。無論如何,這裏是getter/setter類。Android - 兩個類的共享首選項

public class Storage extends Activity { 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
} 

final SharedPreferences prefs = this.getSharedPreferences(
     "uk.co.kenreid.examplestory", Context.MODE_PRIVATE); 

String nameKey = "uk.co.kenreid.examplestory.name"; 

我與這些代碼段中的其他類訪問它(最終被用作變量「存儲」是一種onclicklistener內使用):

final Storage storage = new Storage(); 

storage.storeItem("name", name); 
System.out.println(storage.getString("name")); 

回答

1

我相信你的問題是初始化的SharedPreferences類遠離Activity

假設這是你的問題,你可以傳遞Context通過Storage類的構造函數來初始化它。

例如,

SharedPreferences prefs; 

public Storage(Context aContext){ 
    prefs = aContext.getSharedPreferences("uk.co.kenreid.examplestory", 
      Context.MODE_PRIVATE); 
} 

然後通過您原始的acessor方法訪問。也許是最好的通過傳遞Application Contex噸而非Activity Context的構造函數,所以當你創建你的存儲類,這樣稱呼它的活動:

Storage myStorage = new Storage(getApplicationContext()); 

這也許是明智的創建辛格爾頓類以及允許您使用相同的存儲實例。網上有很多關於Java中的單身人士的教程。

+0

Biddulph.r - 非常感謝,修復它。 –

0

嘗試這樣的:

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity()); 

mVariable = sharedPref.getBoolean(SettingsActivity.KEY_TO_VARIABLE, false); 
+0

歡呼聲回覆。我在getActivity()上發現錯誤,說它對於類型Storage(類名)是未定義的。 –

1

試試這個:

SharedPreferences prefs = this.getSharedPreferences("uk.co.kenreid.examplestory", Context.MODE_MULTI_PROCESS); 
+0

乾杯的迴應,但沒有運氣與此。仍然收到以下錯誤: 致命異常:main ....無法啓動活動ComponentInfo(uk.co.kenreid.examplestory/uk.co.uk.kenreid.examplestory.start):hava.lang.NullPointerException –

0

檢查文檔getSharedPreferences

這裏第一個參數是存儲數據的共享首選項的名稱。因此,您需要使用每個班級的相同名稱來訪問相同的共享偏好設置。

1

存儲在共享偏好的東西:

SharedPreferences prefs = getSharedPreferences("TOT", Context.MODE_PRIVATE); 
    Editor ed = prefs.edit(); 
    ed.putString(key, value); 
    ed.commit(); 

你的情況,你可以使用上面的代碼onCreate方法內。

擷取來自共享偏好的東西:

SharedPreferences prefs = getSharedPreferences("TOT", Context.MODE_PRIVATE); 
    prefs.getString(key, null); 
+0

乾杯對於答覆,但我有理論上的工作(正如我所提到的,我在一個類中工作,它特別是參數傳遞/啓動活動/使用靜態上下文,我有麻煩)。 –

+1

好吧。如果您只是爲了訪問共享首選項數據而開始存儲活動,那麼您不需要。您只需傳遞上下文即可在活動之外訪問它。其次,你開始錯誤的方式。要啓動活動實例,請執行以下操作:Intent intent = new Intent(context,Storage.class); startActivity(意向)。注意:如果您從非活動類開始活動,則必須將該上下文傳遞給該類,然後可以像這樣啓動它:context.startActivity(intent); –

+0

說過了 - 謝謝你幫助我,你對第一個觀點是正確的,但其他人實際上是用我使用的代碼寫出了這部分內容,並解決了問題,但我想親自謝謝你的幫助,並給你一個投票。乾杯。 –

-1

試試這個:

public class Storage extends Application 

應用是用來分享活動數據

+0

你可以評論你的評估嗎?我在Facebook SDK的Scrumptious示例中看到類Application,在我看來,它用於共享來自不同Activity的數據。 –

0

您可以使用一個單獨的類可以處理所有的喜好

public class PreferenceManager { 
    public static void setLogInSuceess(boolean login, Context context) { 
     SharedPreferences preferences; 
     preferences = context.getSharedPreferences("settings", Context.MODE_PRIVATE); 

     preferences.edit().putBoolean("LOGIN", login).commit(); 
    } 

    public static boolean getLogInSuceess(Context context){ 
     SharedPreferences preferences; 
     preferences = context.getSharedPreferences("settings", Context.MODE_PRIVATE); 
     boolean login = preferences.getBoolean("LOGIN", false); 

     return login; 
    } 
} 

用它在任何你想要的,

PreferenceManager.setLogInSuceess(真/假,背景); 布爾_login = PreferenceManager.getLogInSuceess(上下文);