How to handle each item in ListPreference in PreferenceFragmentCompat

358 Views Asked by At
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

2

There are 2 best solutions below

0
UmAnusorn On BEST ANSWER

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

0
akhil nair On

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" />