Android列表首选项:有摘要作为选定的值?

我有一个偏好活动,它使用由我的XML文件定义的列表首选项。 我如何将列表活动的摘要设置为所选的值?

谢谢!

最简单的方法就是让Android为你做。 假设您希望摘要与所选值匹配,您可以使用XML或Java中的setSummary方法简单地将ListPreference的摘要设置为"%s" 。 例如:

 <ListPreference android:key="pref_list" android:title="A list of preferences" android:summary="%s" android:entries="@array/pref_list_entries" android:entryValues="@array/pref_list_entries_values" android:defaultValue="0" /> 

Android会用ListPreference的select器显示的首选项的当前string值replace%s 。 当您input活动时,列表的摘要也将被正确设置 – 您不必编写任何特殊的代码来初始化设置。

在使用SharedPreferences监听器之前,我花太多的时间来解决这个问题。

您可以使用OnPreferenceChangeListenerdynamic更改摘要。 问题是它从android:entryValues获取选定的值,而不是标题( android:entries )。 在下面的代码中,我使用了toString() ,但正确的解决scheme是find值的标题。 无论如何,这个想法的作品:

 public class Preferences extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.your_prefs); ListPreference listPreference = (ListPreference) findPreference("preference_key"); if(listPreference.getValue()==null) { // to ensure we don't get a null value // set first value by default listPreference.setValueIndex(0); } listPreference.setSummary(listPreference.getValue().toString()); listPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { preference.setSummary(newValue.toString()); return true; } }); } } 

我也想实现类似的东西,但是https://stackoverflow.com/a/8155029/592025的问题在于,它显示了我的偏好(如1,2 3等)的值。 我想显示对应于所选值的条目(人类可读的string)。

所以我改变了这种方式,并以我需要的方式工作。

 listPreference.setSummary(servicePreference.getEntry().toString()); listPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { // Set the value as the new value listPreference.setValue(newValue.toString()); // Get the entry which corresponds to the current value and set as summary preference.setSummary(listPreference.getEntry()); return false; } }); 

诀窍是使用getEntry()而不是getValue() ,一旦该值被改变,显式地设置该值并回读该条目。

首先在onCreate中获得对ListPreference的引用。 你可以使用findPreference()。 例如:

 ListPreference pref = (ListPreference) findPreference("thePreferencesKey"); 

然后,当你第一次加载Activity,并且每当首选项值被改变时,使用你想要获得ListPreference的值的任何方法,并设置摘要:

 pref.setSummary(theNewString); 

这是我正在使用的代码,它不手动调用setValue,因为我相信这已经在稍后阶段完成。

这里是一个例子:

 @Override public boolean onPreferenceChange(Preference preference, Object value) { String textValue = value.toString(); ListPreference listPreference = (ListPreference) preference; int index = listPreference.findIndexOfValue(textValue); CharSequence[] entries = listPreference.getEntries(); preference.setSummary( index >= 0 ? entries[index] : null); return true; } 

这正是我所做的,它很好。 在onSharedPreferenceChangeListener中,我只是检查获取更改的关键,然后使用if语句将ListPreferences转换回人类可读(entry,而不是entryValue)。 很简单。

 public class MyPreferences extends PreferenceFragment implements OnSharedPreferenceChangeListener{ public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); context = getActivity(); if (context == null){ Log.e("error","context is null"); } prefs = PreferenceManager.getDefaultSharedPreferences(context); myFrequencyList = (Preference) findPreference("frequency_key"); prefs.registerOnSharedPreferenceChangeListener(this); } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if(key.equals("frequency_key")){ String freq = sharedPreferences.getString("frequency_key", "8k Hz"); if(freq.equals("8000")){ freq = "8k Hz"; } else if(freq.equals("16000")){ freq = "16k Hz"; } else if(freq.equals("22050")){ freq = "22.05k Hz"; } else if(freq.equals("44100")){ freq = "44.1k Hz"; } else if(freq.equals("48000")){ freq = "48k Hz"; } else{ freq = "8k Hz"; } myFrequencyList.setSummary(freq); } 

XML布局

  <ListPreference android:id="@+id/frequency_list" android:key="frequency_key" android:summary="8000" android:title="Sample Rate" android:defaultValue="8000" android:dialogTitle="Larger sample rates create better sound quality but larger file sizes." android:entries="@array/freq_titles" android:entryValues="@array/freq_values" /> 

xml数组

 <?xml version="1.0" encoding="utf-8"?> 
 <string-array name="freq_titles"> <item>48k Hz</item> <item>44.1k Hz</item> <item>22.05k Hz</item> <item>16k Hz</item> <item>8k Hz</item> </string-array> <string-array name="freq_values"> <item>48000</item> <item>44100</item> <item>22050</item> <item>16000</item> <item>8000</item> </string-array> 

下面是midhunhk的答案的扩展版本,以及有用的“android:summary”string

  // Retrieve & populate flash modes List<String> flashmodes = params.getSupportedFlashModes(); if (flashmodes != null) { final ListPreference lp = (ListPreference) findPreference("flash_list"); final String lp_basesummary = "Set the Flash mode. The default is 'auto'"; lp.setEntries(flashmodes.toArray(new CharSequence[flashmodes.size()])); lp.setEntryValues(flashmodes.toArray(new CharSequence[flashmodes.size()])); // If there's only one option, make it the default if (flashmodes.size() == 1) lp.setValueIndex(0); lp.setSummary(lp_basesummary + " [" + lp.getEntry() + "]"); lp.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { // Set the value as the new value lp.setValue(newValue.toString()); // Get the entry which corresponds to the current value // and set as summary preference.setSummary(lp_basesummary + " [" + lp.getEntry() + "]"); return false; } }); } else { // Remove the preference ((PreferenceGroup) findPreference("camera_preference")).removePreference(findPreference("flash_list")); } // Retrieve & populate focus modes List<String> focusmodes = params.getSupportedFocusModes(); if (focusmodes != null) { final ListPreference lp = (ListPreference) findPreference("focus_mode_list"); final String lp_basesummary = "Set the Focus mode. The default is 'auto'"; ... 

而且,为了清楚起见,android:summary将从相关的xml中移除。

以下是用户select后处理铃声首选项摘要更新的一种方法。

  final SharedPreferences preference = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); final RingtonePreference rp_shuttle = (RingtonePreference) findPreference("shuttle_tone"); rp_shuttle.setSummary(RingtoneManager .getRingtone(getApplicationContext(), Uri.parse(preference.getString("shuttle_tone", "DEFAULT_SOUND"))) .getTitle(this)); rp_shuttle.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { public boolean onPreferenceChange(Preference mypreference, Object newValue) { rp_shuttle.setSummary(RingtoneManager.getRingtone(getApplicationContext(), Uri.parse(newValue + "")) .getTitle(getApplicationContext())); return true; } }) 

你在PreferenceActivity上有一个方法bindPreferenceSummaryToValue,

您可以轻松地将摘要添加到列表中,如下所示:

 private static void bindPreferenceSummaryToValue(Preference preference) { preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener); sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, PreferenceManager .getDefaultSharedPreferences(preference.getContext()) .getString(preference.getKey(), "")); } 

在你的OnCreate方法中,你可以像这样调用绑定函数:

 bindPreferenceSummaryToValue(findPreference(getString(R.string.KEY_OF_THE_LIST))); 

您可以用同样的方法轻松添加其他摘要:

 bindPreferenceSummaryToValue(findPreference(getString(R.string.KEY_1))); bindPreferenceSummaryToValue(findPreference(getString(R.string.KEY_2))); bindPreferenceSummaryToValue(findPreference(getString(R.string.KEY_3)));