android - 设置多个 SharedPreferences 实例/文件的默认值

标签 android android-activity sharedpreferences android-preferences preferenceactivity

假设我有一个应用程序将首选项保存到两个文件中,preferences1.xmlpreferences2.xml。然后,我可以使用以下代码检索对相应对象的引用:

SharedPreferences sharedPrefs1 = getSharedPreferences("preferences1", MODE_PRIVATE);
SharedPreferences sharedPrefs2 = getSharedPreferences("preferences2", MODE_PRIVATE);

通过这种方式,我可以操纵两者的首选项,并为两者的变化注册监听器。

我对这两个文件的初始化有些疑惑,用setDefaultValues:

问题 1 - PreferenceFragment 上下文:我创建了一个 PreferenceActivity,其中包含两个 PreferenceFragment 并在 onCreate 中每个方法我执行以下代码( fragment 1 和 2 用 1 和 2 替换 X):

PreferenceManager pm = getPreferenceManager();
pm.setSharedPreferencesName("preferencesX");

PreferenceManager.setDefaultValues(getActivity(),R.xml.preference_fragmentX, false);

我已经看到两个 fragment 在启动时都使用默认值正确设置了它们的首选项。但是,考虑到我在 中只能看到一个 _has_set_default_values.xml 文件这一事实应用程序的shared_prefs目录,它如何理解preferences1.xmlpreferences2.xml的属性已经设置?只要在第一个打开的 PreferenceFragment 中调用 setDefaultValues 就会创建此文件,但即使在此之后,如果我正确打开第二个 PreferenceFragment 它初始化默认值。它如何理解它尚未初始化 preferences2.xml 以及 _has_set_default_values.xml 的目的是什么,因为它不包含有关哪些首选项文件具有的信息初始化了吗?

问题 2 - 标准 Activity 上下文:当我启动我的应用时,PreferenceActivity 不是第一个启动的 Activity,用户可能永远不会打开它,所以我会想在主 Activity 中也用它们的默认值初始化两个首选项文件,我该怎么做?对于默认共享首选项,这很容易:

PreferenceManager.setDefaultValues(this, R.xml.default_preferences, false); 

对于两个偏好文件我应该怎么做?我无法执行以下操作,因为我无法像在 PreferenceFragment 类中那样检索 PreferenceManager 的实例:

PreferenceManager pm = getPreferenceManager(); // NOT AVAILABLE AND NOT WANTED
pm.setSharedPreferencesName("preferences1");
PreferenceManager.setDefaultValues(getActivity(),R.xml.preference_fragment1, false);

PreferenceManager pm = getPreferenceManager(); // NOT AVAILABLE AND NOT WANTED
pm.setSharedPreferencesName("preferences2");            
PreferenceManager.setDefaultValues(getActivity(),R.xml.preference_fragment2, false);

在主 Activity 中,我不需要更改 PreferenceManager 将在其上工作的首选项文件,因为我们不在 PreferenceActivity 中,我只是想初始化这两个文件......有什么帮助吗?我希望我已经发布了一个明确的问题,即使太长了。

最佳答案

您可以像这样创建首选项:

public class MyPreference {

    private static final String APP_SHARED_PREFS1 = "myPrefc1"; 
    private static final String APP_SHARED_PREFS2 = "myPrefc2"; 
    private SharedPreferences   appSharedPrefs1;
    private SharedPreferences   appSharedPrefs2;
    private Editor              prefsEditor1;
    private Editor              prefsEditor2;


    public MyPreference(Context context) {
        this.appSharedPrefs1 = context.getSharedPreferences(APP_SHARED_PREFS1, Activity.MODE_PRIVATE);
        this.appSharedPrefs2 = context.getSharedPreferences(APP_SHARED_PREFS2, Activity.MODE_PRIVATE);
        this.prefsEditor1 = appSharedPrefs1.edit();
        this.prefsEditor2 = appSharedPrefs2.edit();
    }

 public void saveServices(String servicName, boolean isActivated) {
        prefsEditor1.putBoolean(servicName, isActivated);
        prefsEditor1.commit();
        prefsEditor2.putBoolean(servicName, isActivated);
        prefsEditor2.commit();
    }

在您的保存服务或您想根据自己的喜好做的其他事情上,数据将保存在两个文件中。

关于你的第二个问题:

创建一个像 G

这样的全局类

然后像这样声明你的偏好:

public class G extends Application{

    public static Activity currentActivity = null;
    public static MyPreference myAppPref = null;


    @Override
    public void onCreate() {

        super.onCreate();

         myAppPref = new MyPreference(G.this);


    }


}

当你的主要 Activity 运行时,你应该这样做:

G.currentActivity = MainActivity.this;
G. myAppPref.saveServices("testpref", true);

关于android - 设置多个 SharedPreferences 实例/文件的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10727964/

相关文章:

android - 图库问题

android - IllegalStateException - Fragment.getResources

android - 共享偏好? javax.crypto.BadPaddingException : pad block corrupted only in some devices

listview - 查询 ListView 中每一项的 SharedPreferences

java - 类之间的共享首选项(静态)?

Android:从 onReceive 方法设置新的闹钟

android - 如何从 fragment 中控制 Activity FragmentTransaction?

java - 如何在 android 中的两个 ImageButton 之间画一条线?

android - 当 Activity 从最近的 Activity 中被刷掉时,优雅地清理绑定(bind)服务

android - 如何在android中动态创建另一个按钮