Подтвердить что ты не робот

Установка значений по умолчанию для нескольких экземпляров/файлов 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, я просто хочу инициализировать эти два файла... любую помощь? Надеюсь, у меня есть четкий вопрос, даже если он слишком длинный.

4b9b3361

Ответ 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 (файл, режим). Вы можете использовать его для извлечения двух файлов настроек.