У меня проблема: onSharedPreferenceChanged
называется только в первый раз, когда я меняю значение в MultiSelectListPreference
, но больше никогда. Когда я перезапускаю PrefernceActiviy, все настройки сохраняются, и еще один onSharedPreferenceChanged
вызывается только в первый раз.onSharedPreferenceChanged for MultiSelectListPreference не всегда работает
То, что я сделал:
- Я отношусь к моей
PreferenceActivity
как «OnSharedPreferenceChangeListener» (я не создаю annonymous класс) - зарегистрироваться и разрегистрировать
this
объект вonResume()
иonPause
- Я пытаюсь получить
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 _ =>
}
}
}
На самом деле я не могу сделать это так, потому что мой 'PreferenceChangeListener' используется только для изменения сводки в' PreferenceActivity', поэтому его нельзя хранить где-либо еще. – squixy
Постарайтесь опубликовать свой код, чтобы обсудить его. –
Я сознательно не разместил его, потому что это в Скале, но, как вам угодно. – squixy