Android SharedPreferences из PreferenceActivity - PullRequest
1 голос
/ 02 ноября 2010

У меня есть PreferenceActivity, которое загружает свои настройки из XML-файла, который выглядит следующим образом

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:key="first_preferencescreen">
   <ListPreference
 android:key="currlist"
    android:title="Change Currency"
    android:summary="Selecting a new currency will reset your jar!"
    android:entries="@array/currencies"
    android:entryValues="@array/currency_vals" />
    <EditTextPreference
    android:key="goaltxt"
    android:title="Set Goal"
    android:inputType="numberDecimal"
    android:text="0.00"
    />
</PreferenceScreen>

Я хочу передать тип валюты и цель обратно в основной класс, и все объяснения, которые я нашел, очень расплывчаты. В моем методе onStart () в моем основном классе у меня пока есть это:

public void onStart() {
  SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
  SharedPreferences myPrefs = this.getSharedPreferences("myPrefs", MODE_WORLD_READABLE);
  final SharedPreferences.Editor prefsEditor = myPrefs.edit();

  prefs.getInt("currlist", 0);
  prefs.getFloat("goaltxt", 0);


 }

Это действительно расстраивает, и мне бы хотелось немного узнать о том, как работает SharedPreferences. Спасибо!

1 Ответ

9 голосов
/ 02 ноября 2010

SharedPreferences - это способ обмена данными между многими частями вашего приложения.Когда у кого-то есть ссылка на общее предпочтение, он может читать из него что-то вроде этого:

int currlist = prefs.getInt("currlist", 0);
float goal   = prefs.getFloat("goaltxt", 0);

Они также могут зарегистрироваться, чтобы получать уведомления об изменении данных:

prefs.registerOnSharedPreferenceChangeListener(this);

ИхМетод onSharedPreferenceChanged срабатывает, когда кто-то изменяет данные в общих настройках (они, конечно, должны реализовывать интерфейс SharedPreferenceChangedListener).Не забудьте отменить регистрацию, если вы больше не наблюдаете за набором данных.

Как он узнает, когда изменились настройки?Ну, вы должны получить ссылку на SharedPreferences.Editor, прежде чем сможете редактировать данные внутри SharedPreferences, как вы это сделали:

final SharedPreferences.Editor prefsEditor = prefs.edit();

В этот момент вы используете редактор для добавления или обновления некоторыхпеременная, сохраненная в общих настройках:

prefsEditor.putInt("currlist", 1);

И когда вы закончите редактирование, вы фиксируете свои изменения, это уведомит всех слушателей о том, что произошло изменение:

prefsEditor.commit();

Вк этому моменту все зарегистрированные наблюдатели будут уведомлены о том, что произошли изменения в общих настройках (включая ваши собственные!)

Как использовать это:

  1. Когда ваше приложение, действие, служба или что-либо еще запускается, возьмите ссылку на интересующую вас общую настройку, скопируйте все необходимые значения в переменные члена класса и зарегистрируйте себя в качестве наблюдателя.

  2. Не забудьте удалить слушателя, когда ваш класс больше не активен и / или не слушает события изменения.

  3. В вашем методе onSharedPreferenceChanged проверьте, оценивается ли значениеe в prefs.getWhatever("value", default) отличается от вашей переменной члена класса.Если это так, примите меры , но имейте в виду, что это, вероятно, вызывается из другого потока ;вы не можете редактировать пользовательский интерфейс извне потока пользовательского интерфейса, иначе произойдет сбой, точно так же вы не хотите вызывать задержки в потоке пользовательского интерфейса или он зависнет.Выполняйте очень быстро, только локальную работу (добавляйте вещи в очереди и т. Д.) И обязательно пишите потокобезопасный код.

  4. Когда вы изменяете какое-то общее значение, сначала измените переменную члена класса,затем возьмите редактор prefs, внесите изменения в переменную и commit() результат.Ваш локальный onSharedPreferenceChanged слушатель сработает, но так как значение будет таким же, как и у вашей переменной-члена, вы проигнорируете его.

С этого момента ваше межклассовое общение будет устойчивым,изменение префиксов и пользовательского интерфейса плавно обновляет, отправляет обновление работающим службам, передает значения между несвязанными действиями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...