Предпочтения в списке Android: есть сводка в качестве выбранного значения?

У меня есть функция Preference, которая использует префикс List, как определено моим XML-файлом. Как установить сводку активности списка на выбранное значение?

Спасибо!

Самый простой способ сделать это – просто заставить Android сделать это за вас. Предполагая, что вы хотите, чтобы сводка соответствовала выбранному значению, вы можете просто ListPreference список ListPreference с "%s" используя либо XML, либо метод setSummary в Java. Например:

 <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 заменит %s на текущее строковое значение предпочтения, как показано в ListPreference .

Я слишком много времени тратил на прослушивание с прослушивателями SharedPreferences прежде чем обнаружил это. В качестве бонуса итоговое резюме списка будет правильно установлено при вводе операции.

Вы можете использовать OnPreferenceChangeListener для динамического изменения сводки. Проблема в том, что он получает выбранное значение (from android:entryValues ), а не заголовок ( android:entries ). В следующем коде я использовал toString() , но правильным решением является поиск заголовка для значения. В любом случае, идея работает:

 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 и т. Д.). Я хочу показать запись (удобочитаемая строка), соответствующую выбранному значению.

Поэтому я изменил его таким образом и работает так, как он мне нужен.

 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() и после изменения значения, чтобы явно установить значение и прочитать запись.

Сначала получите ссылку на ListPreference в вашем onCreate. Вы можете использовать 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 я просто проверяю ключ от того, что изменяется, а затем для ListPreferences преобразовывает его обратно в считываемое человеком (запись вместо entryValue) с операторами if. Довольно просто.

 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»

  // 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'"; ... 

И, чтобы быть понятным, андроид: резюме удаляется из связанного xml.

И вот один из способов решения сводного обновления предпочтений Ringtone после выбора пользователя.

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

У вас есть метод bindPreferenceSummaryToValue в вашей PreferenceActivity,

Вы можете легко добавить сводку в список, сделав вот так:

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

В методе OnCreate вы вызываете функцию bind следующим образом:

 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)));