21

Предположим, что у меня есть приложение, которое сохраняет предпочтения на два файла, preferences1.xml и preferences2.xml. Тогда я могу получить ссылки на соответствующие объекты со следующим кодом:Установка значения по умолчанию для нескольких экземпляров SharedPreferences/файлов

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

Таким образом, я могу манипулировать предпочтения для обоих и регистрации слушателей для изменения на обоих.

У меня есть некоторые сомнения по поводу инициализации этих двух файлов, с setDefaultValues ​​:

Вопрос 1 - контекст PreferenceFragment: Я создал 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

@crazymaik Я удалил свой ответ, поскольку я не думаю, что это отвечает на вопрос удовлетворительно. Я потратил несколько часов, изучая это сейчас, и это все еще полная тайна ... Надежда, что кто-то еще может пролить свет на нее. –

+0

может у PLZ объяснить больше о SO чат? – KOTIOS

+0

попробуйте использовать префикс .Namespace в одном физическом файле для управления двумя логическими наборами или категориями prefs в пределах одного дескриптора файла. Ваши соответствующие фрагменты должны иметь возможность применять префикс NS таким образом, который не слишком разрушителен для ваших операций CRUD в свойствах pref. –

ответ

-2

1) Я предполагаю, что эти значения по умолчанию будут загружены только при использовании метода getDefaultSharedPreferences() и будут игнорироваться, если вы предоставите свой собственный файл настроек. Не совсем уверен в этом.

2) Вы можете настроить их на подкласс приложения.

http://developer.android.com/reference/android/app/Application.html

Application.onCreate является первым, что будет выполняться, когда пользователь запускает приложение. Это единственная точка входа в ваше приложение и, следовательно, хорошее место для инициализации всех данных, которые необходимы вашему приложению для всей системы.

Поскольку приложение расширяет ContextWrapper, у вас есть доступ к SharedPreferences с помощью метода getSharedPreferences (файл, режим). Вы можете использовать его для извлечения двух файлов настроек.

0

К вопросу 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

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); 
Смежные вопросы