我想在我的设置页面中使用DropDownPreference
,但尽管在Internet上四处浏览,但似乎没有关于此操作的任何不错的教程。有人知道onPreferenceChange
方法中应该包含什么吗?我以前使用了RadioButton
,但现在想使用DropDownPreference
来简化实施和维护。
活动
class SettingsActivity : AppCompatActivity(), FragmentSettings.PreferenceXchangeListener {
private var mCurrentValue: Boolean = false // False is the default value
override fun onCreate(savedInstanceState: Bundle?) {
val mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
mCurrentValue = mSharedPreferences.getBoolean("preference_dark", false)
if (mCurrentValue) {
setTheme(R.style.MyDarkSettingsTheme)
} else {
setTheme(R.style.MyLightSettingsTheme)
}
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_settings)
val viewllSettingsContainer = settings_container
val root = viewllSettingsContainer.rootView
if (mCurrentValue) {
root.setBackgroundColor(Color.BLACK)
} else {
root.setBackgroundColor(Color.WHITE)
}
val settingsFragment = FragmentSettings()
supportFragmentManager
.beginTransaction()
.replace(R.id.settings_container, settingsFragment)
.commit()
}
override fun onXchange(value:Boolean) {
when {
mCurrentValue != value -> {
mCurrentValue = value
recreate()
}
}
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
android.R.id.home -> {
val intent = parentActivityIntent
intent?.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
onBackPressed()
true
}
else ->
super.onOptionsItemSelected(item)
}
}
}
片段
class SettingsFragment : PreferenceFragmentCompat(), Preference.OnPreferenceChangeListener,
Preference.OnPreferenceClickListener {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.app_preferences)
val mDropDownPreference = findPreference<Preference>("preference_dark") as DropDownPreference
mDropDownPreference.onPreferenceChangeListener = this
}
// Declaring PreferenceXchangeListener
private var mPreferenceXchangeListener: PreferenceXchangeListener? = null
// Declaring PreferenceXchangeListener in order to communicate with Activities
interface PreferenceXchangeListener {
fun onXchange(value:Boolean)
}
override fun onAttach(context: Context) {
super.onAttach(context)
// On attach - assign parent Activity as PreferenceXchangeListener
try
{
mPreferenceXchangeListener = context as PreferenceXchangeListener
}
catch (e:ClassCastException) {
Log.e(TAG, "onAttach::::: PreferenceXchangeListener must be set in parent Activity")
}
}
override fun onPreferenceChange(preference: Preference, newValue:Any):Boolean {
return if (preference.key == "preference_dark") {
(preference as RadioButtonPreference).isChecked = newValue as Boolean
// Executing parent Activity's callback with the new value
mPreferenceXchangeListener!!.onXchange(newValue)
true
}
// ... check other preferences here
else false
}
override fun onPreferenceClick(preference: Preference): Boolean {
if (preference is DropDownPreference)
if (preference.key == "preference_dark") {
activity!!.setTheme(R.style.DarkTheme)
activity!!.recreate()
} else {
activity!!.setTheme(R.style.LightTheme)
activity!!.recreate()
}
return true
}
companion object {
private val TAG = SettingsFragment::class.java.simpleName
}
}
我认为您过于复杂了。无需让片段参与侦听将不会处理的首选项的更改并将其传递回活动。您可以为“活动”中的所有首选项注册一个首选项更改侦听器,然后在其中做出相应的响应。
class SettingsActivity : AppCompatActivity(),
SharedPreferences.OnSharedPreferenceChangeListener {
override fun onCreate(savedInstanceState: Bundle?) {
val mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
mSharedPreferences.registerOnSharedPreferenceChangeListener(this)
//...
}
override fun onDestroy() {
mSharedPreferences.unregisterOnSharedPreferenceChangeListener(this)
//...
super.onDestroy()
}
override fun onSharedPreferenceChanged(_: SharedPreferences, key: String) {
when (key){
"preference_dark" -> recreate()
}
}
}