woshiwoxingfu 2012-09-17 03:01 采纳率: 100%
浏览 3873
已采纳

在Preperence列表中,怎么显示出一个AndroidPreference的当前值?

当用户在Android应用上编辑preferences时,我想要让他们在Preference列表可以看到preference当前设置的值
例如:如果我有一个Preference设置成“删除旧信息”,当这个消息被阅读后,指定在多少天后删除消息。在PreferenceActivity中,我比较想要用户看到这样:
“删除旧信息” <- 标题
“x天后删除信息”<-列表中x就是Preference当前的值
这个可以重复使用,这个我就能够简单的把它应用到我所有的preferences中了,而不用管他们的类型(以便它使用最少数量的EditTextPreference,ListPreference等仍然可以工作)

  • 写回答

3条回答 默认 最新

  • 漫随风起 2012-09-17 03:35
    关注

    很不幸,这看起来并不简单,这样做的自动方法(你应该也注意到了,几乎没有本地的preferences这样做)。那就是说,我确定这是一个相当普通的需求,所以这是我达到这个目的的方法。
    关键是要让你的PreferenceActivity类实现OnSharedPreferenceChangeListener方法。使用onSharedPreferenceChanged方法你可以监听到具体的preference关键字,然后在相关的preference上使用setSummary来控制修改文本,像这样:

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {

    if (key.equals(KEY_A_CHECKBOX_PREFERENCE)) {
        mCheckBoxPreference.setSummary(sharedPreferences.getBoolean(key, false) ? "Disable this setting" : "Enable this setting");
    }
    else if (key.equals(KEY_AN_EDITTEXT_PREFERENCE)) {
        mEditBoxPreference.setSummary("Current value is " + sharedPreferences.getString(key, "")); 
    }
    }
    

    在应用程序共享参数上允许这个类作为一个监听者来对preference的改变进行监听使用registerOnSharedPreferenceChangeListener 方法 ,像这样:

    getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
    

    你的最好的方法就是在onResume上进行登记然后再在onPause中撤销。当你登记这个监听者来确保你获得了正确的初始值得时候,你可能也需要更新文件的值
    下边的例子是android示例

    public class AdvancedPreferences extends PreferenceActivity implements 
    OnSharedPreferenceChangeListener {
       public static final String KEY_LIST_PREFERENCE= "list_preference";
       public static final String KEY_CHECKBOX_PREFERENCE= "checkbox_preference";
       private CheckBoxPreference mCheckBoxPreference;
       private ListPreference mListPreference;
       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.advanced_preferences);
            mCheckBoxPreference= (CheckBoxPreference)getPreferenceScreen().findPreference(KEY_ADVANCED_CHECKBOX_PREFERENCE);
            mListPreference= (ListPreference)getPreferenceScreen().findPreference(KEY_LIST_PREFERENCE);
       }
       @Override
       protected void onResume() {
           super.onResume();
            mCheckBoxPreference.setSummary(sharedPreferences.getBoolean(key, false) ? "Disable this setting" : "Enable this setting");
            mListPreference.setSummary("Current value is " + sharedPreferences.getValue(key, ""));
                        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
       }
       @Override
       protected void onPause() {
           super.onPause();
                       getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
           }
       public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
           if (key.equals(KEY_CHECKBOX_PREFERENCE)) {
              mCheckBoxPreference.setSummary(sharedPreferences.getBoolean(key, false) ? "Disable this setting" : "Enable this setting");
           }
           else if (key.equals(KEY_LIST_PREFERENCE)) {
              mListPreference.setSummary("Current value is " + sharedPreferences.getValue(key, ""));
            }
       }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥50 如何增强飞上天的树莓派的热点信号强度,以使得笔记本可以在地面实现远程桌面连接
  • ¥15 MCNP里如何定义多个源?
  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services