2

Недавно я импортировал библиотеку HoloEverywhere из GitHub в Eclpse и начал использовать ее в приложении, которое уже работает. В целом я доволен библиотекой, и все идет хорошо.onSharedPreferenceChanged() Никогда не вызывал

Я стараюсь использовать org.holoeverywhere.preference.PreferenceActivity вместо моих старых PreferenceActivity. Пользовательский интерфейс выглядит так, как должно, но Я заметил, что onSharedPreferenceChanged() больше не вызывает вызов. Что я делаю не так?

AFAIK Я пользуюсь библиотекой по своему усмотрению. Я почти ничего не изменил с моей старой версии до новой версии, используя HoloEverywhere. В то время как существует много вопросов на SO, я не мог найти ничего, что касается моей проблемы.

Соответствующий код размещен ниже:

import org.holoeverywhere.LayoutInflater; 
import org.holoeverywhere.preference.Preference; 
import org.holoeverywhere.preference.PreferenceFragment; 
import org.holoeverywhere.preference.PreferenceManager; 
import org.holoeverywhere.preference.PreferenceScreen; 
import org.holoeverywhere.preference.SharedPreferences; 
import org.holoeverywhere.preference.SharedPreferences.Editor; 
import org.holoeverywhere.preference.SharedPreferences.OnSharedPreferenceChangeListener; 


public class SettingsActivity extends org.holoeverywhere.preference.PreferenceActivity implements SyncManager.SyncProgressListener, SharedPreferences.OnSharedPreferenceChangeListener 
{ 
private static SharedPreferences prefs; 

@Override 
public void onCreate(Bundle savedInstanceState) 
    { 
    prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    } 

public void onSharedPreferenceChanged(SharedPreferences prefs, String key) 
    { 
    // do some really important stuff here 
    } 

public static class DisplaySetttingsFragment extends PreferenceFragment 
    { 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
     { 
     super.onCreate(savedInstanceState); 
     getActivity().setTitle(getString(R.string.pref_display_title)); 
     addPreferencesFromResource(R.xml.display_preferences); 
     } 

    @Override 
    public void onResume() 
     { 
     super.onResume(); 
     prefs.registerOnSharedPreferenceChangeListener((SettingsActivity) getActivity()); 
     } 

    @Override 
    public void onPause() 
     { 
     super.onPause(); 
     prefs.unregisterOnSharedPreferenceChangeListener((SettingsActivity) getActivity()); 
     } 
    } 
} 

Update: пример, где я менять и совершать предпочтения, и я бы ожидать onSharedPreferenceChanged(), чтобы называться

@Override 
    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) 
     { 

     String resetString = getString(R.string.pref_key_reset_display); 
     String key = preference.getKey(); 

     if (key != null && key.equals(resetString)) 
      { 
      prefs.edit(). 
       putBoolean(getString(R.string.pref_key_reset_display), true).commit(); 
      } 

     return super.onPreferenceTreeClick(preferenceScreen, preference); 
     } 

Обновление: I d o Не верю, что это проблема моих предпочтений, не имеющих зарегистрированного слушателя (в данном случае мой SettingsActivity) во время commit() или apply(). Я могу отлаживать и видеть, что WeakHashMap внутри prefs для слушателей всегда имеет свою деятельность в качестве участника. Я попытался создать глобальную переменную, которая является слушателем, но это не имеет никакого значения.

+0

Можете ли вы опубликовать метод, в котором вы что-то меняете в префиксах? – Opiatefuchs

+0

@Opiatefuchs Добавлен пример в соответствии с запросом. – Jon

ответ

2

попытка вызвать

prefs.registerOnSharedPreferenceChangeListener(this)

в OnCreate в SettingsActivity. Вызов его во Фрагменте во внутреннем классе приведет к уничтожению слушателей, когда внутренний фрагмент будет приостановлен, я полагаю,

+0

Нет разницы. При отладке я могу видеть внутренние элементы 'prefs'. У него есть «WeakHashMap» для хранения слушателей, но я всегда вижу свою активность как участника независимо от того, где я регистрирую/отменю регистрацию слушателя. – Jon

6

Возможно, у вас отсутствуют следующие вызовы: это может решить вашу проблему.

@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 
    getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); 
} 

/* (non-Javadoc) 
* @see android.app.Activity#onPause() 
*/ 
@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 

    getPreferenceScreen().getSharedPreferences() 
    .unregisterOnSharedPreferenceChangeListener(this); 
} 
0

Проверьте предпочтительность.xml. Все предпочтения имеют определенное значение ключа? Если нет, то обратный вызов не будет запущен.

0

У меня была аналогичная проблема. Для меня слушатель был вызван для стандартного свойства, но не для одного набора с editor.

Решение пришло от doku for the listener

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

Решение для меня устанавливало сначала boolean, а затем правильное значение (и совершает каждое изменение).

Смежные вопросы