【问题标题】:Preferences not showing summary in PreferencesFragment首选项未在 PreferenceFragment 中显示摘要
【发布时间】:2014-10-17 21:41:49
【问题描述】:

我有一个首选项屏幕 (Fragment),其中包含一些从 xml 文件中设置的首选项。我在Fragment 中调用的唯一内容是 onCreate 方法中的addPreferencesFromResource(R.xml.pref_main);

现在,除了我的首选项中的“摘要”部分之外,一切都运行良好,例如,如果您有一个 EditTextPreference 并且您输入了一些文本,那么该文本应该以较小的字母在首选项下可见。

我正在使用自定义控件作为首选项(但它也不适用于任何官方首选项),它扩展了DialogPreference。如果我这样设置摘要:

@Override
protected void onDialogClosed(boolean positiveResult) {
    if (positiveResult) {
        setSummary("Some summary");
    }
}

它可以工作,但只要我不离开屏幕,当我返回时它就不再存在了。 有什么想法吗?

【问题讨论】:

    标签: android android-fragments android-preferences


    【解决方案1】:

    首选项屏幕不会自动显示摘要数据。您需要在代码中执行此操作。这是您可以在 onCreate() 方法中使用的代码片段。调用后添加addPreferencesFromResource(R.xml.pref_main);

    for(int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) {
        initializeSummary(getPreferenceScreen().getPreference(i));
    }
    

    initializeSummary()方法是这样的:

    private void initializeSummary(Preference p)
    {
        if(p instanceof ListPreference) {
            ListPreference listPref = (ListPreference)p;
            p.setSummary(listPref.getEntry());
        }
        if(p instanceof EditTextPreference) {
            EditTextPreference editTextPref = (EditTextPreference)p;
            p.setSummary(editTextPref.getText());
        }
    }
    

    【讨论】:

    • 成功了,谢谢!是否有任何特殊原因导致它不自动显示?另外,另一个快速的问题是,我如何从自定义首选项类中的 sharedpreferences 中读取首选项?
    • 我认为 Android 操作系统不会自动执行此操作。要阅读共享首选项,请使用SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);。然后,您可以使用键读取值。
    • 谢谢!只是给未来读者的一个提示,您必须在每个 PreferenceCategory 的首选项上重新运行 updatePrefSummary。此外,当我从默认的 EditTextPreference 返回时,现在没有设置摘要。除了扩展课程之外,还有什么办法吗?
    • 要更新每次更改的摘要,请在片段中覆盖它:@Override public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { updatePrefSummary(findPreference(key)); }
    • 如果ListPreference 被包裹在PreferenceCategory 下,它不会到达ListPreference。您将需要另一个if 来处理instance of PreferenceCategory,这对递归来说并不困难。但是,这似乎不起作用..我想知道这是否是因为所选值取代了摘要。
    【解决方案2】:

    正如@Anthony 在 cmets 中提到的那样,您的偏好 XML 中可能有 PreferenceCategory 实例。我们可以如下递归处理它们。

    
    class SettingsFragment : PreferenceFragmentCompat() {
    
         /**
         * Initialises the summary of EdittextPreference's and ListPreference's 
         * that might be nested in PreferenceCategories. 
         */
        private fun summarize(pref: Preference) {
            when (pref) {
                is PreferenceCategory -> {
                    for (i in 0 until pref.preferenceCount) {
                        summarize(pref.getPreference(i))
                    }
                }
                is EditTextPreference -> pref.summary = pref.text
                is ListPreference -> pref.summary = pref.entry
                else -> {
                    Log.w("Summarize", "Ignoring preference of type ${pref::class.java}")
                }
            }
        }
    
        override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
            setPreferencesFromResource(R.xml.root_preferences, rootKey)
            for (i in 0 until preferenceScreen.preferenceCount) {
                summarize(preferenceScreen.getPreference(i))
            }
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-01
      相关资源
      最近更新 更多