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

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

问题描述:

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

很不幸,这看起来并不简单,这样做的自动方法(你应该也注意到了,几乎没有本地的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, ""));
        }
   }
}

这有很多更普遍使用的方法来解决这个问题,希望那将满足你的需求。
例如,如果你想要一般的有所有参数列表来显示他们在概要中的选择,在使用的时候你可以使用onSharedPreferenceChanged

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
   Preference pref= findPreference(key);
   if (prefinstanceof ListPreference) {
       ListPreference listPref= (ListPreference) pref;
        pref.setSummary(listPref.getEntry());
   }
}

这个对于其他的preference类很容易扩展
而且通过在PreferenceScreen和PreferenceCategory中使用getPreferenceCount和getPreference函数,你可以很容易的写一个通用函数来遍历preference树,这些树设置了所有的你想要他们在字符串中体现的参数的列表。

这是我的解决方法

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.PreferenceCategory;
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);
           for(int i=0;i<getPreferenceScreen().getPreferenceCount();i++){
             initSummary(getPreferenceScreen().getPreference(i));
           }
       }
       @Override
        protected void onResume(){
           super.onResume();

                        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
       }
       @Override
        protected void onPause() {
            super.onPause();

                        getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
            }
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
             updatePrefSummary(findPreference(key));
       }
       private void initSummary(Preference p){
           if (pinstanceof PreferenceCategory){
               PreferenceCategory pCat= (PreferenceCategory)p;
               for(int i=0;i<pCat.getPreferenceCount();i++){
                    initSummary(pCat.getPreference(i));
               }
           }else{
                updatePrefSummary(p);
           }
       }
       private void updatePrefSummary(Preference p){
           if (pinstanceof ListPreference) {
               ListPreference listPref= (ListPreference) p;
                 p.setSummary(listPref.getEntry());
            }
           if (pinstanceof EditTextPreference) {
               EditTextPreference editTextPref= (EditTextPreference) p;
                 p.setSummary(editTextPref.getText());
            }
       }
}