2012-12-31 63 views
1

我爲我的應用程序創建了一個SettingsActivity。在這Activity我使用SharedPreferences類來處理用戶可編輯的首選項。putExtra是將數據傳遞給新Activity的唯一方式嗎?

在設置SharedPreferences時,我必須將它們加載到主要活動的onCreate中,然後再次在SettingsActivity中加載。可能是因爲兩個調用getXXXX()方法都需要默認值,我認爲將默認值硬編碼到兩個地方並不好,因爲我認爲將來如果改變它們會有問題。

這樣做是最好的還是最受歡迎的(或接受的標準)?

  • 創建一個全局變量類,我可以在其中導入每個活動並在其中定義默認常量?

  • 使用putExtragetExtra將數據從主要活動傳遞到設置活動?

其他建議?

+2

我認爲你的第一個選擇聽起來像是一個很好的解決方案。在集中的類中使用'public static final'變量是一種提供可以被其他類共享的常量值的Java語言。 –

回答

3

我覺得溼眶客有一個很好的答案,但如果你正在尋找一個替代方案,考慮所有設置爲成員創造一個Settings類。它可以有一個靜態方法,如loadFromPreferences(Context),它將返回一個Settings對象,它使用任何默認設置從SharedPreferences構建。它也可以有一個saveSettings(Context)方法來保存您的編輯。希望有所幫助。

-2

您可以將對象聲明爲public static並從另一個類引用它們。

ActivityA:

public static int testIntegerA = 42; 

Intent intentInteger = new Intent(getActivityContext(), ActivityB.class); 
intentInteger.putExtra("INTENT_EXTRA", testIntegerA); 
startActivity(intentInteger); 

ActivityB:

public static int intentInt, staticInt; 

staticInt = ActivityA.testIntegerA; 
intentInt = getIntent().getExtras().getInt("INTENT_EXTRA"); 

現在既intentIntstaticInt等於42;

+0

不是一個好的設計模型。我無法想到Android'Activity'類需要用於維護全局變量的原因。 – Squonk

+0

如果您有一個線性導航應用程序,並且每個應用程序都有一個變量,比如說電子郵件的內容,每個活動在將消息傳遞給下一個將進一步更改的活動之前會更改消息,此方法字精細。 – Adam

+0

你如何定義「線性導航」?此外,Android設計允許外部應用程序在任何第三方應用程序的組件中註冊用於特定用途的「」。假設我創建了一個包含PDF查看器的應用程序,併爲PDF MIME類型註冊了「ACTION_VIEW」。您的應用程序需要查看PDF文件,然後開始「Activity」,但需要在我的應用程序中訪問另一個「Activity」的「靜態」字段。爲什麼我的PDF閱讀器「Activity」需要訪問另一個'Activity'的靜態成員以履行你的應用的''合同? – Squonk

1

就我個人而言,在這種情況下,我會把默認值放在一個資源文件中。這樣就不需要使用全局變量類或輔助類。 Android資源已經爲您做到了。

參見:

Providing resources

More resource types

+0

這似乎是一個令人難以置信的簡單解決方案。我會試試看。 –

+0

@JimThornton:確實。如果數據類型是「String」(例如),您甚至可以通過創建不同的'/ res/values-xx'目錄(其中xx是國家/語言代碼)來使用本地化,操作系統將自動選擇正確的。 – Squonk

+0

如果您的設置需要使用代碼計算的默認值,那麼問題會再次回來。 – marcinj

0

而不是使用具有靜態值的類爲什麼不擴展應用程序類,它將永遠生活在應用程序的進程時。你可以保留共享方法和變量

0

我強烈建議在兩個活動的onCreate中打開SharedPreference。每次嘗試使用全局變量時,這些值都會以難以檢測和修復的方式消失。活動在關閉時被銷燬。服務可以隨時從內存中移除。如果您的服務正在休眠並且內存中沒有活動,則應用程序上下文將被銷燬。

這就是說,把變量放在應用程序的上下文中可能是最好的地方。創建一個擴展Application並設置AndroidManifest.xml的類來使用它。如果您嘗試從服務或廣播接收器使用它,請不要期望價值在那裏。另外,除非您的活動加載速度太慢,否則您最好花時間在功能上,而不是優化。

+0

我目前在兩項活動的onCreate中都有SharedPreferences。但是,這似乎是造成我的問題的原因。從邏輯上講,我認爲將每個getXXXX()方法的默認值進行硬編碼在道路上會出現問題,所以我認爲必須有更好的方法。這不是關於優化我的代碼,而是關於學習「正確」或「接受」的做事方式。有很多方法可以讓事情發揮作用,但是由於我只是在學習,所以我認爲最好從一開始就學會如何有效地做到這一點。 –

相關問題