我正在使用PreferenceActivity来显示我的应用程序的一些设置。我通过一个xml文件膨胀设置,使我的onCreate(和完整的类方法)看起来像这样:

public class FooActivity extends PreferenceActivity {
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        addPreferencesFromResource(R.xml.preference);
    }
}

PreferenceActivity PreferenceFragment的javadoc声明

当用户与这些首选项交互时,这些首选项将自动保存到SharedPreferences。要检索这个活动中的首选项层次结构将使用的一个SharedPreferences实例,调用getDefaultSharedPreferences(android.content.Context),并在与这个活动相同的包中调用上下文。

但是我如何在另一个活动中获得SharedPreference的名称?我只能打电话

getSharedPreferences(name, mode)

在其他活动中,但我需要PreferenceActivity使用的SharedPreference的名称。什么是名称或我如何检索它?


当前回答

尝试以下源代码,它为我工作

//Fetching id from shared preferences
    SharedPreferences sharedPreferences;
    sharedPreferences =getSharedPreferences(Constant.SHARED_PREF_NAME, Context.MODE_PRIVATE);
    getUserLogin = sharedPreferences.getString(Constant.ID_SHARED_PREF, "");

其他回答

首先声明这些方法。

public static void putPref(String key, String value, Context context) {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
    SharedPreferences.Editor editor = prefs.edit();
    editor.putString(key, value);
    editor.commit();
}

public static String getPref(String key, Context context) {
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    return preferences.getString(key, null);
}

然后当你想要放置一个pref时调用这个:

putPref("myKey", "mystring", getApplicationContext());

当你想要得到一个pref时调用这个:

getPref("myKey", getApplicationContext());

或者您可以使用该对象https://github.com/kcochibili/TinyDB--Android-Shared-Preferences-Turbo 这就进一步简化了一切

例子:

TinyDB tinydb = new TinyDB(context);

tinydb.putInt("clickCount", 2);
tinydb.putFloat("xPoint", 3.6f);
tinydb.putLong("userCount", 39832L);

tinydb.putString("userName", "john");
tinydb.putBoolean("isUserMale", true); 

tinydb.putList("MyUsers", mUsersArray);
tinydb.putImagePNG("DropBox/WorkImages", "MeAtlunch.png", lunchBitmap);

如果你有一个复选框,你想在任何Java文件中获取它的值,即true / false

使用——

Context mContext;
boolean checkFlag;

checkFlag=PreferenceManager.getDefaultSharedPreferences(mContext).getBoolean(KEY,DEFAULT_VALUE);`

尝试以下源代码,它为我工作

//Fetching id from shared preferences
    SharedPreferences sharedPreferences;
    sharedPreferences =getSharedPreferences(Constant.SHARED_PREF_NAME, Context.MODE_PRIVATE);
    getUserLogin = sharedPreferences.getString(Constant.ID_SHARED_PREF, "");

到处传递上下文真的让我很恼火。代码变得过于冗长且难以管理。相反,我在每个项目中都这样做……

public class global {
    public static Activity globalContext = null;

并将其设置在主活动create中

@Override
public void onCreate(Bundle savedInstanceState) {
    Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(
            global.sdcardPath,
            ""));
    super.onCreate(savedInstanceState);

    //Start 
    //Debug.startMethodTracing("appname.Trace1");

    global.globalContext = this;

此外,所有的首选键都应该是语言独立的,我很惊讶居然没有人提到这一点。

getText(R.string.yourPrefKeyName).toString()

现在在一行代码中像这样简单地调用它

global.globalContext.getSharedPreferences(global.APPNAME_PREF, global.MODE_PRIVATE).getBoolean("isMetric", true);

如果你不能访问getdefaultsharedpreferences(),你可以使用getSharedPreferences(name, mode),你只需要传入正确的名称。

Android创建这个名称(可能是基于你的项目的包名?)您可以通过将以下代码放在SettingsActivity onCreate()中,并查看preferencesName是什么来获得它。

String preferencesName = this.getPreferenceManager().getSharedPreferencesName();

字符串应该是com.example.projectname_preferences之类的东西。在项目的某个地方硬编码,并将其传递给getSharedPreferences(),这样就可以了。