简体   繁体   中英

How to handle each item in ListPreference in PreferenceFragmentCompat

class SettingsFragment : PreferenceFragmentCompat() {

    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.root_preferences, rootKey)

    }
}

root_preferences

<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">

<PreferenceCategory app:title="@string/language_setting_header">
    <ListPreference
        app:defaultValue="en"
        app:entries="@array/language_entries"
        app:entryValues="@array/language_values"
        app:key="@string/key_lang"
        app:title="@string/language_setting_title"
        app:useSimpleSummaryProvider="true" />

</PreferenceCategory>

for

 onPreferenceTreeClick

Only trig when show the dialog but not trig on each item in ListPreference

Instead of listen to each item of the list

Listen when prefChange. Also registListener onResume and onPause

Solution in Kotlin for PreferenceFragmentCompat

class SettingsFragment : PreferenceFragmentCompat() {
    private val  prefListener = SharedPreferences.OnSharedPreferenceChangeListener { prefs, key ->
        when (key) {
            "lang" -> {
                activity?.finish()
            }
        }
    }

    override fun onResume() {
        super.onResume()
        preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(
            prefListener
        )
    }

    override fun onPause() {
        preferenceManager.sharedPreferences.unregisterOnSharedPreferenceChangeListener(
            prefListener
        )
        super.onPause()
    }

    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.root_preferences, rootKey)
        preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(
            prefListener
        )
    }

}

https://developer.android.com/reference/androidx/preference/PreferenceFragmentCompat

This is how am doing it.

class SettingsFragment : PreferenceFragmentCompat() {
    var prefListener = SharedPreferences.OnSharedPreferenceChangeListener { prefs, key ->
        when (key) {
            "lang" -> {
                activity?.finish()
            }
        }
    }

    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.root_preferences, rootKey)
        preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(
            prefListener
        )
    }
}

XML

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:orderingFromXml="true">

   <ListPreference
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:defaultValue="0"
       android:entries="@array/array_update"
       android:entryValues="@array/array_update_hours"
       android:key="update"
       android:summary="@string/pref_summary_update"
       android:title="@string/pref_title__update" />

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM