在摘要中显示EditTextPreference的值

我是一个学习如何在Android开发并想要进行设置的活动,

我的设置活动

public class Main extends Activity { protected SettingsFragment settingsFragment; @SuppressLint("NewApi") @TargetApi(11) public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); setSummaries(); } @Override public void onResume() { final SharedPreferences sh = getPreferenceManager().getSharedPreferences() ; super.onResume(); sh.registerOnSharedPreferenceChangeListener(this); } @Override public void onPause() { final SharedPreferences sh = getPreferenceManager().getSharedPreferences() ; super.onPause(); sh.unregisterOnSharedPreferenceChangeListener(this); } @SuppressLint("NewApi") public void setSummaries(){ final SharedPreferences sh = getPreferenceManager().getSharedPreferences() ; //Pref1 Preference stylePref = findPreference("editTextPref"); stylePref.setSummary(sh.getString("editTextPref", "")); //here the other preferences.. } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if (key.equals("editTextPref")) { Preference pref = settingsFragment.findPreference(key); // Set summary to be the user-description for the selected value pref.setSummary(sharedPreferences.getString(key, "")); } //here the others preferences } }//End fragment @SuppressLint("NewApi") @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); settingsFragment = new SettingsFragment(); getFragmentManager().beginTransaction() .replace(android.R.id.content, settingsFragment) .commit(); } } 

和我的res/preferences.xml文件

 <?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> <PreferenceCategory android:title="BTA" xmlns:android="http://schemas.android.com/apk/res/android"> <EditTextPreference android:key="editTextPref" android:title="Numero de telephone" android:summary="This allows you to enter a string" android:defaultValue="*"/> </PreferenceCategory> </PreferenceScreen> 

所以现在我有活动的设置活动。 但是我想在android:summary显示EditTextPref的值。 我发现了很多话题,但是所有的function都被弃用了。

编辑:感谢@Ace_McIntosh,我编辑我的代码的人谁想要它,现在的工作。

Solutions Collecting From Web of "在摘要中显示EditTextPreference的值"

只需在所需的Preference对象上使用setSummary方法即可 。 在你想要更新的每个条目(即,你的情况下的所有EditTextPreference条目)恢复你的设置片段并在具体的SharedPreferences对象上注册一个OnSharedPreferenceChangeListener (这样你可以更新总结,以防万一它被改变)并传递它所需的EditTextPreference的值(可以通过它的getText()方法获得)。

像这样在你的MyPreferenceFragment实现它(我不能保证它能正常工作,它只是给你一个想法的目的):

 public class MyPreferenceFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { SharedPreferences sharedPreferences; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // load the preferences from your XML resource (which I assume you already do anyway) addPreferencesFromResource(R.xml.preferences); } @Override public void onResume() { super.onResume(); sharedPreferences = getPreferenceManager().getSharedPreferences(); // we want to watch the preference values' changes sharedPreferences.registerOnSharedPreferenceChangeListener(this); Map<String, ?> preferencesMap = sharedPreferences.getAll(); // iterate through the preference entries and update their summary if they are an instance of EditTextPreference for (Map.Entry<String, ?> preferenceEntry : preferencesMap.entrySet()) { if (preferenceEntry instanceof EditTextPreference) { updateSummary((EditTextPreference) preferenceEntry); } } } @Override public void onPause() { sharedPreferences.unregisterOnSharedPreferenceChangeListener(this); super.onPause(); } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { Map<String, ?> preferencesMap = sharedPreferences.getAll(); // get the preference that has been changed Object changedPreference = preferencesMap.get(key); // and if it's an instance of EditTextPreference class, update its summary if (preferencesMap.get(key) instanceof EditTextPreference) { updateSummary((EditTextPreference) changedPreference); } } private void updateSummary(EditTextPreference preference) { // set the EditTextPreference's summary value to its current text preference.setSummary(preference.getText()); } } 

最简单的方法似乎是创build自己的EditTextPreference类 (修改为编译):

 package your.package; import android.content.Context; import android.util.AttributeSet; public class EditTextPreference extends android.preference.EditTextPreference{ public EditTextPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public EditTextPreference(Context context, AttributeSet attrs) { super(context, attrs); } public EditTextPreference(Context context) { super(context); } @Override public CharSequence getSummary() { if ( super.getSummary() == null ) { return null; } String summary = super.getSummary().toString(); return String.format(summary, getText()); } } 

并在你的xml中使用这个:

 <your.package.EditTextPreference android:key="pref_alpha" android:summary="Actual value: %s" android:title="Title" android:defaultValue="default" /> 

上面的例子中有一些bug,所以我想我发布了一个工作解决scheme(同时支持ListPreference和MultiSelectListPreference)

 public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { private SharedPreferences sharedPreferences; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.settings); } @Override public void onResume() { super.onResume(); sharedPreferences = getPreferenceManager().getSharedPreferences(); sharedPreferences.registerOnSharedPreferenceChangeListener(this); PreferenceScreen preferenceScreen = getPreferenceScreen(); for(int i = 0; i < preferenceScreen.getPreferenceCount(); i++) { setSummary(getPreferenceScreen().getPreference(i)); } } @Override public void onPause() { sharedPreferences.unregisterOnSharedPreferenceChangeListener(this); super.onPause(); } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { Preference pref = getPreferenceScreen().findPreference(key); setSummary(pref); } private void setSummary(Preference pref) { if (pref instanceof EditTextPreference) { updateSummary((EditTextPreference) pref); } else if (pref instanceof ListPreference) { updateSummary((ListPreference) pref); } else if (pref instanceof MultiSelectListPreference) { updateSummary((MultiSelectListPreference) pref); } } private void updateSummary(MultiSelectListPreference pref) { pref.setSummary(Arrays.toString(pref.getValues().toArray())); } private void updateSummary(ListPreference pref) { pref.setSummary(pref.getValue()); } private void updateSummary(EditTextPreference preference) { preference.setSummary(preference.getText()); } } 

@ serv-inc的回答为我工作。 不知何故,其他答案只有当价值改变时才起作用。

但是在它工作之前,我必须做出如下改变:

 @Override public CharSequence getSummary() { return getText(); } 

它显示最初显示时的值,值更改时以及恢复后的值。