2012-05-29 3 views
3

Я пытаюсь добавить настройку в свое приложение. Я добавил новую настройку, но я не уверен, где положить OnSharedPreferenceChangeListener. Я положил его в действие и добавил Log.d(), но Log.d() никогда не срабатывает. Есть идеи?Лучшее место для размещения onSharedPreferenceChangeListener

+0

Это будет зависеть от того, где вы обновляете свои 'SharedPreferences'. Если они обновляются в рамках одной и той же «Деятельности», которая реализует слушателя, тогда она должна работать. Если «Активность», которая реализует слушатель, в настоящий момент не запущена, или если она «скрыта» (приостановлена ​​/ остановлена ​​и т. Д.), То она не будет. Если это должно работать через «Деятельности» или «Службы» и т. Д., Тогда было бы лучше расширить класс «Приложение» и внедрить его. – Squonk

ответ

0

Вам необходимо зарегистрировать своего слушателя, вызвав setOnPreferenceChangeListener. Я собираюсь предположить, что у вас есть класс Activity, который расширяет PreferenceActivity. Если это так, это лучшее место для слушателя. Вы бы написать что-то вроде этого:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // Load the preferences from an XML resource 
    addPreferencesFromResource(R.xml.preferences); 

    Preference myPreference = findPreference("my_pref"); 
    myPreference.setOnPreferenceChangeListener(this); 
} 
+1

Вопрос был о 'OnSharedPreferenceChangeListener' - также см. [Здесь] (http://stackoverflow.com/questions/15604536/android-where-should-a-onsharedpreferencechangelistener-be-defined-registered) –

+0

А, моя ошибка. – twaddington

3

Лучшее место по Android Settings doc будет:

@Override 
protected void onResume() { 
    super.onResume(); 
    getPreferenceScreen().getSharedPreferences() 
      .registerOnSharedPreferenceChangeListener(this); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    getPreferenceScreen().getSharedPreferences() 
      .unregisterOnSharedPreferenceChangeListener(this); 
} 

И вы должны хранить слушателя в переменном поле (или использовать сам объект активности - в приведенном выше исходном коде), чтобы он не собирал мусор.

I.e. объект анонимного класса не может использоваться как OnSharedPreferenceChangeListener.

+0

Это должен быть правильный ответ. Например, в родительской активности, в которой размещается ваш PreferenceFragment, в onCreate можно вызвать метод, например initSharedPrefsListener(). Этот метод присваивал бы «new onSharedPreferenceChangeListener()» членной переменной, mListener. Методы регистрации/отмены регистрации называются упомянутыми выше. – Futureproof