2011-04-20 171 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);