在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());
}
}
}