为了账号安全,请及时绑定邮箱和手机立即绑定

如何在“首选项”摘要中显示Android首选项的当前值?

如何在“首选项”摘要中显示Android首选项的当前值?

饮歌长啸 2019-08-14 16:18:56
如何在“首选项”摘要中显示Android首选项的当前值?这必须经常出现。当用户在Android应用中编辑首选项时,我希望他们能够在Preference摘要中查看首选项的当前设置值。示例:如果我有“丢弃旧邮件”的“首选项”设置,该设置指定需要清除邮件的天数。在PreferenceActivity我想让用户看到:“丢弃旧邮件” < - 标题“ x天后清理消息” < - summary其中x是当前的Preference值额外的功劳:使这个可重用,所以我可以轻松地将它应用到我的所有首选项,无论其类型如何(这样它可以使用EditTextPreference,ListPreference等,只需最少的编码)。
查看完整描述

3 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

如果符合您的需求,有很多方法可以使这个解决方案成为更通用的解决方案。

例如,如果您希望通常将所有列表首选项显示为摘要,则可以将其用于onSharedPreferenceChanged实现:

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    Preference pref = findPreference(key);

    if (pref instanceof ListPreference) {
        ListPreference listPref = (ListPreference) pref;
        pref.setSummary(listPref.getEntry());
    }}

这很容易扩展到其他偏好类。

并通过getPreferenceCountgetPreference在功能PreferenceScreenPreferenceCategory,你可以很容易地编写一个通用函数走偏好树设置类型的所有喜好的你渴望自己的概要toString表示


查看完整回答
反对 回复 2019-08-14
?
Qyouu

TA贡献1786条经验 获得超11个赞

这是我的解决方案...... FWIW

package com.example.PrefTest;import android.content.SharedPreferences;import android.content.SharedPreferences.OnSharedPreferenceChangeListener;import android.os.Bundle;import android.preference.EditTextPreference;import android.preference.ListPreference;import android.preference.Preference;import android.preference.PreferenceActivity;import android.preference.PreferenceGroup;import android.preference.PreferenceManager;public class Preferences extends PreferenceActivity implements
        OnSharedPreferenceChangeListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
        PreferenceManager.setDefaultValues(Preferences.this, R.xml.preferences,
            false);
        initSummary(getPreferenceScreen());
    }

    @Override
    protected void onResume() {
        super.onResume();
        // Set up a listener whenever a key changes
        getPreferenceScreen().getSharedPreferences()
                .registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        // Unregister the listener whenever a key changes
        getPreferenceScreen().getSharedPreferences()
                .unregisterOnSharedPreferenceChangeListener(this);
    }

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
            String key) {
        updatePrefSummary(findPreference(key));
    }

    private void initSummary(Preference p) {
        if (p instanceof PreferenceGroup) {
            PreferenceGroup pGrp = (PreferenceGroup) p;
            for (int i = 0; i < pGrp.getPreferenceCount(); i++) {
                initSummary(pGrp.getPreference(i));
            }
        } else {
            updatePrefSummary(p);
        }
    }

    private void updatePrefSummary(Preference p) {
        if (p instanceof ListPreference) {
            ListPreference listPref = (ListPreference) p;
            p.setSummary(listPref.getEntry());
        }
        if (p instanceof EditTextPreference) {
            EditTextPreference editTextPref = (EditTextPreference) p;
            if (p.getTitle().toString().toLowerCase().contains("password"))
            {
                p.setSummary("******");
            } else {
                p.setSummary(editTextPref.getText());
            }
        }
        if (p instanceof MultiSelectListPreference) {
            EditTextPreference editTextPref = (EditTextPreference) p;
            p.setSummary(editTextPref.getText());
        }
    }}


查看完整回答
反对 回复 2019-08-14
?
烙印99

TA贡献1829条经验 获得超13个赞

Android 文档说可以在以下位置使用String格式标记getSummary()

如果摘要中包含字符串格式标记(即“%s”或“%1 $ s”),则当前条目值将替换为其位置。

只需android:summary="Clean up messages after %s days"在ListPreference中指定xml声明就适合我。

注意:这仅适用于ListPreference


查看完整回答
反对 回复 2019-08-14
  • 3 回答
  • 0 关注
  • 553 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信