Установка значений по умолчанию для нескольких экземпляров/файлов SharedPreferences
Предположим, что у меня есть приложение, которое сохраняет предпочтения на два файла: preferences1.xml и preferences2.xml. Затем я могу получить ссылки на соответствующие объекты со следующим кодом:
SharedPreferences sharedPrefs1 = getSharedPreferences("preferences1", MODE_PRIVATE);
SharedPreferences sharedPrefs2 = getSharedPreferences("preferences2", MODE_PRIVATE);
Таким образом, я могу манипулировать настройками для обоих и регистрировать прослушиватели для изменений на обоих.
У меня есть некоторые сомнения относительно инициализации этих двух файлов с помощью setDefaultValues:
Вопрос 1 - Контекст предпочтения. Я создал PreferenceActivity с двумя PreferenceFragments и внутри метода onCreate каждого из них я выполняю следующий код (замените X 1 и 2 на фрагменты 1 и 2 ):
PreferenceManager pm = getPreferenceManager();
pm.setSharedPreferencesName("preferencesX");
PreferenceManager.setDefaultValues(getActivity(),R.xml.preference_fragmentX, false);
Я видел, что оба фрагмента правильно устанавливают свои предпочтения со значениями по умолчанию при запуске.. но, учитывая тот факт, что я могу видеть только один файл _has_set_default_values.xml в shared_prefs, как это понимать, когда свойства preferences1.xml и preferences2.xml уже установлены? Этот файл создается, как только setDefaultValues вызывается в первом открытом PreferenceFragment, но даже после этого, если я открываю второй PreferenceFragment, он правильно инициализирует значения по умолчанию. Как он понимает, что он еще не инициализировал preferences2.xml и какова цель _has_set_default_values.xml, учитывая тот факт, что он не содержит информацию о том, какие файлы привилегий были инициализированы?
Вопрос 2 - Контекст стандартной активности. Когда я запускаю свое приложение, PreferenceActivity - это не первое запущенное действие, и пользователь никогда не может его открыть, поэтому я хотел бы инициализировать два файла настроек с их значениями по умолчанию также в основной деятельности, как я могу это сделать? Для стандартных настроек по умолчанию это легко:
PreferenceManager.setDefaultValues(this, R.xml.default_preferences, false);
Для двух файлов предпочтений, как я должен делать? Я не могу сделать что-то вроде следующего, так как я не могу получить экземпляр PreferenceManager, как в классах PreferenceFragment:
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);
Здесь, в основной деятельности, мне не нужно менять файлы предпочтений, на которых работает PreferenceManager, поскольку мы не в PreferenceActivity, я просто хочу инициализировать эти два файла... любую помощь? Надеюсь, у меня есть четкий вопрос, даже если он слишком длинный.
Ответы
Ответ 1
вы можете создать такое предпочтение:
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);
}
}
и когда вы начнете свою основную деятельность, вы должны сделать следующее:
G.currentActivity = MainActivity.this;
G. myAppPref.saveServices("testpref", true);
Ответ 2
Для вопроса 1
Я считаю, что файл _has_set_default_values.xml - это еще один файл настроек... и он хранит пары ключ/значение там, где ключ является именем файла предпочтения, а значение - значения по умолчанию были установлены.
Для вопроса 2
Почему бы не использовать версию PreferenceManager.setDefaultValues (), которая принимает имя файла общих настроек? Это подпись метода:
public static void setDefaultValues (Context context, String sharedPreferencesName, int sharedPreferencesMode, int resId, boolean readAgain)
http://developer.android.com/reference/android/preference/PreferenceManager.html
Ответ 3
1) Я предполагаю, что эти значения по умолчанию будут загружены только в том случае, если используется метод getDefaultSharedPreferences() и будет проигнорирован, если вы предоставите свой собственный файл настроек. Не совсем уверен в этом.
2) Вы можете установить их в подклассе Application.
http://developer.android.com/reference/android/app/Application.html
Application.onCreate - первое, что нужно выполнить, когда пользователь запускает ваше приложение. Это единственная точка входа в ваше приложение и, следовательно, хорошее место для инициализации всех данных, которые требуется вашему приложению для всей системы.
Поскольку приложение расширяет ContextWrapper, у вас есть доступ к SharedPreferences с помощью метода getSharedPreferences (файл, режим). Вы можете использовать его для извлечения двух файлов настроек.