2013-07-12 2 views
1

У меня проблема: onSharedPreferenceChanged называется только в первый раз, когда я меняю значение в MultiSelectListPreference, но больше никогда. Когда я перезапускаю PrefernceActiviy, все настройки сохраняются, и еще один onSharedPreferenceChanged вызывается только в первый раз.onSharedPreferenceChanged for MultiSelectListPreference не всегда работает

То, что я сделал:

  1. Я отношусь к моей PreferenceActivity как «OnSharedPreferenceChangeListener» (я не создаю annonymous класс)
  2. зарегистрироваться и разрегистрировать this объект в onResume() и onPause
  3. Я пытаюсь получить SharedPreference в двух направлениях, так как
    a) getPreferenceScreen(). GetSharedPreferences()
    a) новые SharedPreferences (this)
    но оба пути работали точно так же

Что я делаю неправильно?


Опубликовано код:

object PreferencesActivity { 
    final val KEY_AUTO_REFRESH = "preference_auto_refresh" 
    final val KEY_REFRESH_PERIOD = "preference_refresh_period" 
    final val KEY_NOTIFICATIONS = "preference_notifications" 
    final val KEY_AUTO_MARK_AS_READ = "preference_auto_mark_as_read" 
    final val KEY_CHECKED_RADIO_BUTTON = "preference_checked_radio" 
    final val KEY_SHOW_SELECTED_ONLY = "preference_show_selected_only" 
    final val KEY_KEEP_READ_FEEDS = "preference_keep_read_feeds" 

    private final val DEFAULT_REFRESH_PERIOD = "10" 
} 

class PreferencesActivity extends SherlockPreferenceActivity with OnSharedPreferenceChangeListener { 
    private lazy val sharedPreferences = getPreferenceScreen.getSharedPreferences 

    override def onCreate(savedInstanceState: Bundle) = { 
     super.onCreate(savedInstanceState) 
     addPreferencesFromResource(R.xml.preferences) 
     getSupportActionBar.setDisplayHomeAsUpEnabled(true) 
    } 

    override def onResume = { 
     super.onResume 
     getPreferenceScreen.getSharedPreferences 
      .registerOnSharedPreferenceChangeListener(this) 

     configureRefreshPeriod 
     configureNotificationsType 
    } 

    override def onPause = { 
     super.onPause 
     getPreferenceScreen.getSharedPreferences 
      .unregisterOnSharedPreferenceChangeListener(this) 
    } 

    private def configureRefreshPeriod = { 
     val textViewRefreshPeriod = findPreference(KEY_REFRESH_PERIOD) 
     textViewRefreshPeriod.setSummary(getNotificationPeriod) 
    } 

    private def getNotificationPeriod = { 
     val refreshPeriodValue = sharedPreferences.getString(KEY_REFRESH_PERIOD, DEFAULT_REFRESH_PERIOD) 
     val summaryRefreshPeriod_general = getString(R.string.preference_period_summary) 
     val summaryRefreshPeriod_concrete = String.format(summaryRefreshPeriod_general, refreshPeriodValue.toString) 
     summaryRefreshPeriod_concrete 
    } 

    private def configureNotificationsType = { 
     val textViewNotifications = findPreference(KEY_NOTIFICATIONS) 
     textViewNotifications.setSummary(getNotificationKinds) 
    } 

    private def getNotificationKinds = { 
     val notificationsSet = sharedPreferences.getStringSet(KEY_NOTIFICATIONS, new HashSet) 

     if (!notificationsSet.isEmpty) 
      getString(R.string.preference_notifications_summary_checked) + 
       getStringValuesFromSet(notificationsSet) 
     else 
      getString(R.string.preference_notifications_summary_unchecked) 

    } 

    private def getStringValuesFromSet(notificationsSet: Set[String]) = { 
     notificationsSet.toArray.mkString(", ") 
    } 

    override def onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) = 
     key match { 
      case `KEY_REFRESH_PERIOD` => configureRefreshPeriod 
      case `KEY_NOTIFICATIONS` => configureNotificationsType 
      case _ => 
     } 
    } 
} 

ответ

-1

У меня была аналогичная проблема, и я нашел решение. Я не знаю, может ли это вам помочь, но я все равно объясню это, надеясь, что это будет полезно.

Я изначально поставил Listener в PreferenceActivity, но он не работал так, как мне хотелось, поэтому я переместил PreferenceChangeListener в мою MainActivity (потому что в настройках моего приложения можно изменить в разных местах от PreferenceActivity).

Я создал этот класс в MainActivity.java:

private class PreferenceChangeListener implements OnSharedPreferenceChangeListener { 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 

     // Function to manage changes 
     somethingChanged(); 
    } 
} 

И я его в создание экземпляра метода MainActivity OnCreate:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // mPreferenceListener is a private attribute of MainActivity.java 
    mPreferenceListener = new PreferenceChangeListener(); 
    settings.registerOnSharedPreferenceChangeListener(mPreferenceListener); 

    [..] 

} 

В этом случае слушатель правильно перехватывающий все настройки изменения, в том числе MultiSelectListPreference.

+0

На самом деле я не могу сделать это так, потому что мой 'PreferenceChangeListener' используется только для изменения сводки в' PreferenceActivity', поэтому его нельзя хранить где-либо еще. – squixy

+0

Постарайтесь опубликовать свой код, чтобы обсудить его. –

+0

Я сознательно не разместил его, потому что это в Скале, но, как вам угодно. – squixy