2011-04-20 254 views
29

我必須使用android中的sharedpreferences類共享首選項,並且首選項必須在兩個活動之間共享。我應該如何將這些偏好從一項活動轉移到另一項活動中?可以使用靜態變量,但它們不適合我。Android共享首選項

//code for setting shared preferences 
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); 
SharedPreferences.Editor editor = settings.edit(); 
editor.putString("login_session_key",response.getLogin_Session_Key()); 
editor.putString("user_name", username.getText().toString()); 
editor.commit(); 

//code for getting shared preferences 
SharedPreferences settings = getSharedPreferences(SignIn.PREFS_NAME, 
       Activity.MODE_PRIVATE); 
username = (TextView) findViewById(R.id.username); 
String uname = settings.getString("user_name", null); 
username.setText(uname); 
+0

我已經實現了一個通用SharedPreferences包裝,一起來看看:http://android-know-how-to.blogspot.co.il/2014/03/androids-shared-preferences.html – TacB0sS 2014-03-13 13:49:07

回答

92

您應該通過意向調用將它們傳遞給活動,或者您應該閱讀新活動中需要的活動。

創建一個幫助程序類,處理所有活動的共享首選項調用。然後在任何需要存儲/獲取首選項的活動上實例化它的實例。

您的活動
public class AppPreferences { 
    public static final String KEY_PREFS_SMS_BODY = "sms_body"; 
    private static final String APP_SHARED_PREFS = AppPreferences.class.getSimpleName(); // Name of the file -.xml 
    private SharedPreferences _sharedPrefs; 
    private Editor _prefsEditor; 

    public AppPreferences(Context context) { 
     this._sharedPrefs = context.getSharedPreferences(APP_SHARED_PREFS, Activity.MODE_PRIVATE); 
     this._prefsEditor = _sharedPrefs.edit(); 
    } 

    public String getSmsBody() { 
     return _sharedPrefs.getString(KEY_PREFS_SMS_BODY, ""); 
    } 

    public void saveSmsBody(String text) { 
     _prefsEditor.putString(KEY_PREFS_SMS_BODY, text); 
     _prefsEditor.commit(); 
    } 
} 

則...

public class MyActivity extends Activity { 

    private AppPreferences _appPrefs; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     _appPrefs = new AppPreferences(getApplicationContext()); 
     // ... 
    } 
} 

String someString = _appPrefs.getSmsBody(); 

_appPrefs.saveSmsBody(someString); 
+0

我需要一些代碼來證明,我也知道理論的答案,但我需要大量的代碼證據。 – 2011-04-20 18:17:55

+2

爲什麼你想在活動之間分享偏好值?您可以在任何活動中使用共享首選項值。 – Venky 2011-04-20 18:21:16

+1

@Sultan共享首選項在同一個應用程序(包)中的所有活動之間共享。如果您獲得了SharedPreferences.Editor並提交了一些值,然後啓動一個新的Activity,則該Activity可以獲取SharedPreferences對象,並使用相同的給定鍵(標識該鍵的字符串)檢索該值。 – Maximus 2011-04-20 18:27:04

0

如果只是兩個活動,那麼你可以使用Bundle來傳遞值。對於兩個以上的活動,建議您使用SharedPreferences。

下面是使用包傳遞值的示例:

String sample="Hello World!"; 
Bundle b=new Bundle(); 
b.putString("key_sample",sample); 
Intent intent_sample=new Intent(this,Activity_Sample.class); 
intent_sample.putExtras(b); 
startActivity(intent_sample); 

爲了得到傳遞的值:

try{ 
    Bundle get_bundle=getIntent().getExtras(); 
    String get_string=get_bundle.getString("key_sample"); 
}catch(Exception e){ 
    e.printStackTrace(); 
} 

檢查了這一點:http://www.codestacks.in/2013/03/bundle-values-activities/

SharedPreferences實施例:

public class SharedPreferencesDemo extends Activity { 

    SharedPreferences shared_preferences; 
    SharedPreferences.Editor shared_preferences_editor; 
    String test_string = ""; 

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

    shared_preferences = getSharedPreferences("shared_preferences_test", 
     MODE_PRIVATE); 
    test_string = shared_preferences.getString("test_key", "Default"); 

    Toast.makeText(getApplicationContext(), test_string, Toast.LENGTH_SHORT) 
     .show(); 

    shared_preferences_editor = shared_preferences.edit(); 

    shared_preferences_editor.putString("test_key", "Hello World"); 
    shared_preferences_editor.commit(); 

    test_string=shared_preferences.getString("test_key", "Default"); 

    Toast.makeText(getApplicationContext(), test_string, Toast.LENGTH_SHORT).show(); 
    } 
} 

下面是完整的解釋:http://www.codestacks.in/sharedpreferences/

+0

活動數量與您是否應該/不應使用SharedPreferences無關。這些首選項旨在在應用程序執行之間存儲狀態。擁有使用SharedPreferences的單個活動是完全合理的。 – 2013-04-29 11:37:22

+0

另外,在你的例子中你使用了很多魔術字符串。將這些提取到常量中以減少引入錯誤的可能性。 – 2013-04-29 11:39:03

1

我認爲關鍵是個人instantiatiing這樣

SharedPreference preferences = PreferenceManager.getDefaultSharedPreferences(mContext); 

的SharedPreference,我用this Library它需要的參與sharedPreferences所有的辛苦照料,並使其可在所有活動中。

+1

大大簡化了使用SharedPreferences的工作。 – Sparky1 2015-12-30 19:24:11

+0

另一個(我自己的) - http://stackoverflow.com/a/36032323/1957401 – AndroidMechanic 2016-03-16 10:03:40

0

我以前遇到過類似的問題,因此編寫了這個庫來簡化Android的使用SharedPreferences

Android-SharedPreferences-Helper on GitHub - 按照此鏈接瞭解詳細說明和使用/設置說明。

簡化默認Android SharedPreferences類的使用。 開發人員可以在幾行代碼中完成,否則將會有 需要幾個代碼。簡單易懂,與默認的 類相比,易於使用。

1

https://github.com/deviant-studio/Gendalf 只要試試這個庫。

// before 
final String ageKey = "age"; 
final String userNameKey = "userName"; 
final String adminKey = "admin"; 
SharedPreferences prefs = getSharedPreferences("custom_prefs", Context.MODE_PRIVATE); 
SharedPreferences.Editor editor = prefs.edit(); 
editor.putInt(ageKey, 12); 
editor.putString(userNameKey, "Luke"); 
editor.putBoolean(adminKey,true); 
editor.apply(); 

// after 
Gendalf.with(this) 
     .setAge(12) 
     .setUserName("Luke") 
     .setAdmin(true);