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

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

Спасибо!

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

  

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-макет

   

массив xml

  

  48k Hz 44.1k Hz 22.05k Hz 16k Hz 8k Hz   48000 44100 22050 16000 8000  

Вот расширенная версия ответа midhunhk, в которой также рассматривается полезная строка «android: summary»

  // Retrieve & populate flash modes List 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 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))); 

в onCreatePreferences делают это:

 SharedPreferences sharedPreferences =getPreferenceScreen().getSharedPreferences(); PreferenceScreen prefScreen = getPreferenceScreen(); int count = prefScreen.getPreferenceCount(); for (int i = 0; i < count; i++) { Preference p = prefScreen.getPreference(i); if (p instanceof ListPreference) { String value = sharedPreferences.getString(p.getKey(), ""); ListPreference listPreference = (ListPreference) preference; int prefIndex = listPreference.findIndexOfValue(stringValue); if (prefIndex >= 0) { preference.setSummary(listPreference.getEntries()[prefIndex]); } } } 
  • Запуск Google Maps Directions через намерение Android
  • Как выполнить итерацию файлов в каталоге в Java?
  • Широковещательный приемник для проверки подключения к Интернету в приложении Android
  • java.lang.ClassNotFoundException: org.postgresql.Driver, Android
  • В чем разница между ServletContextHandler.setResourceBase и ResourceHandler.setResourceBase при использовании встроенного контейнера Jetty?
  • Преобразование строки в целое число на Android
  • Бесконечная прокрутка Image ViewPager
  • Ошибка AndroidRuntime: Посылка: не удалось вывести значение маршала
  • Основной метод не найден, даже если я его объявил
  • Как перемещать маркер вдоль полилинии с помощью карты google
  • Есть ли способ получить количество меток чисел, используемых в файле jar
  • Давайте будем гением компьютера.