【问题标题】:How to handle each item in ListPreference in PreferenceFragmentCompat如何处理 PreferenceFragmentCompat 中 ListPreference 中的每个项目
【发布时间】:2020-12-18 12:14:56
【问题描述】:
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>

 onPreferenceTreeClick

仅在显示对话框时触发,而不是在 ListPreference 中的每个项目上触发

【问题讨论】:

    标签: android kotlin android-preferences preferencefragmentcompat


    【解决方案1】:

    这就是我的做法。

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

    【讨论】:

      【解决方案2】:

      而不是听列表中的每一项

      在 prefChange 时收听。还要注册Listener onResume 和 onPause

      Kotlin 中 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-11
        • 1970-01-01
        相关资源
        最近更新 更多