关于首选项:如何从Android中的PreferenceActivity获取SharedPreferences?

How do I get the SharedPreferences from a PreferenceActivity in Android?

我正在使用首选项活动显示应用程序的某些设置。我正在通过一个XML文件对设置进行扩展,以便我的onCreate(和完整的类方法)如下所示:

1
2
3
4
5
6
7
public class FooActivity extends PreferenceActivity {
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        addPreferencesFromResource(R.xml.preference);
    }
}

PreferenceActivity的JavaDoc说明

These preferences will automatically save to SharedPreferences as the user interacts with them. To retrieve an instance of SharedPreferences that the preference hierarchy in this activity will use, call getDefaultSharedPreferences(android.content.Context) with a context in the same package as this activity.

但如何在另一个活动中获取共享引用的名称?我只能打电话

1
getSharedPreferences(name, mode)

在另一个活动中,但我需要由PreferenceActivity使用的SharedReference的名称。名称是什么,或者如何检索?


1
2
3
4
import android.preference.PreferenceManager;
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
// then you use
prefs.getBoolean("keystring", true);

更新

根据Sai Geetha M N的共享偏好Android开发者教程(第13部分)。

Many applications may provide a way to capture user preferences on the
settings of a specific application or an activity. For supporting
this, Android provides a simple set of APIs.

Preferences are typically name value pairs. They can be stored as
"Shared Preferences" across various activities in an application (note
currently it cannot be shared across processes). Or it can be
something that needs to be stored specific to an activity.

  • 共享首选项:共享首选项可由应用程序的所有组件(活动、服务等)使用。

  • 活动处理的首选项:这些首选项只能在特定活动中使用,不能由应用程序的其他组件使用。

  • 共享首选项:

    共享偏好由Context类的getSharedPreferences方法管理。首选项存储在默认文件(1)中,或者您可以指定用于引用首选项的文件名(2)。

    (1)建议的方法是在默认模式下使用,而不指定文件名

    1
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);

    (2)下面是在指定文件名时如何获取实例

    1
    2
    public static final String PREF_FILE_NAME ="PrefFile";
    SharedPreferences preferences = getSharedPreferences(PREF_FILE_NAME, MODE_PRIVATE);

    MODE_PRIVATE是首选项的操作模式。这是默认模式,意味着创建的文件将仅由调用应用程序访问。支持的其他两种模式是MODE_WORLD_READABLEMODE_WORLD_WRITEABLE。在MODE_WORLD_READABLE中,其他应用程序可以读取创建的文件,但不能修改。对于MODE_WORLD_WRITEABLE的情况,其他应用程序也对创建的文件具有写权限。

    最后,一旦您有了Preferences实例,下面是如何从Preferences中检索存储的值:

    1
    int storedPreference = preferences.getInt("storedInt", 0);

    要在首选项文件中存储值,必须使用SharedPreference.Editor对象。EditorSharedPreference类中的嵌套接口。

    1
    2
    3
    SharedPreferences.Editor editor = preferences.edit();
    editor.putInt("storedInt", storedPreference); // value to store
    editor.commit();

    编辑器还支持像remove()clear()这样的方法从文件中删除首选值。

    活动首选项:

    共享首选项可由其他应用程序组件使用。但是,如果您不需要与其他组件共享首选项,并且希望拥有活动私有首选项,那么您可以借助活动的getPreferences()方法来实现这一点。getPreference方法使用getSharedPreferences()方法,并将活动类的名称作为首选文件名。

    下面是获取首选项的代码

    1
    2
    SharedPreferences preferences = getPreferences(MODE_PRIVATE);
    int storedPreference = preferences.getInt("storedInt", 0);

    存储值的代码也与共享首选项的代码相同。

    1
    2
    3
    4
    SharedPreferences preferences = getPreference(MODE_PRIVATE);
    SharedPreferences.Editor editor = preferences.edit();
    editor.putInt("storedInt", storedPreference); // value to store
    editor.commit();

    您还可以使用其他方法,如在数据库中存储活动状态。注:Android还包含一个名为android.preference的软件包。包定义类来实现应用程序首选项UI。

    要查看更多示例,请查看开发者网站上的Android数据存储帖子。


    如果你没有访问getDefaultSharedPreferenes()的权限,你可以使用getSharedPreferences(name, mode)代替,你只需要输入正确的名字。

    Android创建此名称(可能基于项目的包名称?).您可以通过将以下代码放入SettingsActivityonCreate()中,并查看preferencesName是什么来获得它。

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

    字符串应该类似于com.example.projectname_preferences。硬代码,在你的项目中的某个地方,并把它传递给getSharedPreferences(),你应该可以去。


    首先声明这些方法。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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时调用这个:

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

    当您想获得首选项时,请调用此选项:

    1
    getPref("myKey", getApplicationContext());

    也可以使用此对象https://github.com/kcochibili/tinydb--android-shared-preferences-turbo更进一步简化了一切

    例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    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);


    在任何地方都必须传递上下文,这真的让我恼火。代码变得过于冗长,无法管理。我在每个项目中都这样做…

    1
    2
    public class global {
        public static Activity globalContext = null;

    并在主活动中设置它创建

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Override
    public void onCreate(Bundle savedInstanceState) {
        Thread.setDefaultUncaughtExceptionHandler(new CustomExceptionHandler(
                global.sdcardPath,
               ""));
        super.onCreate(savedInstanceState);

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

        global.globalContext = this;

    而且所有的偏好键都应该独立于语言,我很惊讶没有人提到这一点。

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

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

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


    如果您有一个复选框,您希望在任何Java文件中获取它的值Itrue(false)。

    使用——

    1
    2
    3
    4
    Context mContext;
    boolean checkFlag;

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

    更新2019

    您可以简单地使用PowerPreference

    https://github.com/aliesaassadi/android-power-preference

    正在获取共享首选项实例

    要获取默认实例,只需调用

    1
    PowerPreference.getDefaultFile()

    或者如果您想要一个特定的首选项文件

    1
    PowerPreference.getFileByName(fileName)

    写作数据:

    1
    PowerPreference.getDefaultFile().put(key,value)

    获取数据

    1
    PowerPreference.getDefaultFile().getString(key,value)