Intereting Posts
Smartcast невозможно, потому что у владельца есть открытый или пользовательский getter Причины, что принятое намерение будет NULL в onStartCommand Как распространять обновления для пользователей предустановленного платного Android-приложения? Как получить покрытие кода с помощью Android Studio? Правильный способ расширения ParseObject и создания фабрики общих запросов Установка ADT на Eclipse Как уникально хранить идентификатор регистрации GCM в MySQL OnClickListener триггеры после onLongClickListener Подключение ADB с использованием Wi-Fi для не-внедренного устройства Android – Как отрезать часть изображения и показать его в изображении Android java.lang.OutOfMemoryError Назначьте ширину до половины ширины доступного экрана декларативно Как отправлять и получать широковещательные сообщения Добавление правильной поддержки клавиатуры в RecyclerView Google Play «Родные платформы», показывающие commons-io-2.4.jar

Предпочтение переключателя – обработка как onPreferenceChange, так и onPreferenceClick

Я пытаюсь получить предпочтение переключателя, работающего на Android, в котором я могу перехватывать и обрабатывать по-разному, в некоторых случаях, когда они включаются / выключаются, когда они нажимают на все предпочтения.

Это то, что я пытаюсь выполнить: пользователь переходит в теги предпочтений, и теги не хранятся (т. Е. Предпочтение тега пусто). Пользователь активирует предпочтение для тегов, и поскольку в настоящее время не сохраняются теги, он запускает активность поиска тегов Для пользователя, чтобы найти тег. – работает отлично.

Если тег уже существует, и они меняют состояние ТОЛЬКО, обновите значение как обычно. – работает отлично

Вот моя проблема: если они щелкают предпочтение, хотя и у них уже сохранен тег, не изменяйте состояние (независимо от того, включено ли оно или отключено), запустите операцию поиска тегов. – Это НЕ работает.

То, что я нашел до сих пор, заключается в том, что в последнем сценарии выше я получаю вызов onPreferenceChanged, за которым следует вызов onPreferenceClicked, а затем последующий вызов onPreferenceChanged. Кажется, это моя проблема. Первый вызов onPreferenceChanged заставляет моего слушателя называть мои SharedPreferences сообщать ему, что он теперь включен.

Если бы я не получил первый вызов onPreferenceChanged, то у меня не было бы проблемы.

Вот соответствующие разделы, где я настраиваю слушателей

SwitchPreference tagPref = (SwitchPreference) findPreference(PreferencesConstants.PREFERENCE_TAG_ENABLED); tagPref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference, Object newValue) { Log.e("BLAH", "onPrefChanged....is it handled by OnClick?" + Boolean.toString(handledByClick)); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity().getApplicationContext()); boolean enabled = prefs.getBoolean(PreferencesConstants.PREFERENCE_TAG_ENABLED, false); Log.e("BLAH", "value stored in prefs? " + Boolean.toString(enabled)); if (newValue instanceof Boolean) { enabled = (Boolean) newValue; } Log.e("BLAH", "New value? " + Boolean.toString(enabled)); if (!handledByClick) { if (enabled && (currentTag == null || currentTag.isEmpty())) { Log.e("BLAH", "Enabled and CurrentTag empty!"); Intent intent = new Intent(getActivity(), TagSearchActivity.class); startActivityForResult(intent, 0); return false; // always return false, we'll handle // updating // this value manually. } else { return true; } } Log.e("BLAH", "returning false (AS IN WE HANDLED IT)."); return false; } }); tagPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { handledByClick = true; Log.e("BLAH", "onprefClick"); Intent intent = new Intent(getActivity(), TagSearchActivity.class); startActivityForResult(intent, 0); return true; } }); 

Ниже приведены соответствующие строки журнала после запуска с сохраненным тегом и нажатия на эту настройку.

 01-18 15:55:05.593: E/BLAH(13261): onPrefChanged....is it handled by OnClick?false 01-18 15:55:05.593: E/BLAH(13261): value stored in prefs? true 01-18 15:55:05.593: E/BLAH(13261): New value? false 01-18 15:55:05.613: E/DifferentClass(13261): On Shared Preferences Changed - tagEnabled 01-18 15:55:05.652: E/DifferentClass(13261): disabled TAG in cancelAlarmService 01-18 15:55:05.662: E/AnotherClass(13261): Updating Feed List. Old Size: 33, New Size: 14 01-18 15:55:05.682: E/BLAH(13261): onprefClick 01-18 15:55:05.812: E/BLAH(13261): onPrefChanged....is it handled by OnClick?true 01-18 15:55:05.812: E/BLAH(13261): value stored in prefs? false 01-18 15:55:05.822: E/BLAH(13261): New value? false 01-18 15:55:05.822: E/BLAH(13261): returning false (AS IN WE HANDLED IT). 

Solutions Collecting From Web of "Предпочтение переключателя – обработка как onPreferenceChange, так и onPreferenceClick"

Я уже давно работаю с той же проблемой, и вы можете сделать это двумя способами.

Внедрение switchpreference с настраиваемыми действиями для каждого события:

  • Навсегда помогли сделать некоторые хорошие моменты. Я пытался следовать за ними, но для меня они этого не делали. Бьюсь об заклад, они работают, но я нуждался в большей функциональности более простым способом. Xgouchet (вторая ссылка) использует заголовки и пользовательские макеты xml, которые используют пользовательские места размещения и измерения (высота, witdth, дополнение и т. Д.). Мне нужно решение без изменения Googles, построенного в автоматически сгенерированном макете.

  • Супер простой и мощный способ: реализовать собственный SwitchPreference ! Просто создайте класс, расширяющий SwitchPreference а затем реализуйте / переопределите его так:

     public class AutoUploadSwitchPreference extends SwitchPreference { public AutoUploadSwitchPreference(Context context) { super(context); } public AutoUploadSwitchPreference(Context context, AttributeSet attrs) { super(context, attrs); } public AutoUploadSwitchPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onClick() { //super.onClick(); THIS IS THE IMPORTANT PART! } 

Переопределяя onClick() и комментируя / удаляя super.onClick() вызов callChangeListener(Object newValue) NOT вызывает callChangeListener(Object newValue) . Теперь вы можете выбрать предпочтение, и ничего не произойдет, пока вы этого не захотите. (Одна ошибка, которая onPreferenceChange бы иначе, onPreferenceChange в том, что в фрагменте было много вызовов onPreferenceChange )


Теперь! Чтобы все произошло: вот структура, которую я использовал.

  • Создать SettingsActivity
    • В нем убедитесь, что вы выбираете настройки, ресурсы и т. Д.
  • В onCreate() в вашей деятельности – запустите PreferenceFragment
    • Это должен быть специальный класс, расширяющий PreferenceFragment , см. Здесь: PreferenceFragment
  • В своем обычном фрагменте воспользуйтесь вашими предпочтениями. Вы можете использовать findPreference("custom_switch_key") .

    • Добавьте OnPreferenceChangeListener по предпочтению
    • Я лично делаю свой фрагмент реализатором слушателя и передаю this как аргумент.
    • Оператор return важен. Именно это делает фактическое изменение в коммутаторе. Если вы вернетесь, то переключатель переключится на newValue. Если вы вернете false, это не произойдет. Если вы используете return false; Вы можете изменить значение с помощью setChecked (true | false) на switchpreference.
  • Когда вы реализуете onPreferenceChange(Preference preference, Object newValue) вы можете добавить любую функциональность, которую хотите от нажатия только слайдера switch

  • Функциональность щелчка предпочтения может быть выполнена тремя способами:
    • Внедрить onClick() далее в пользовательский класс SwitchPreference
    • Внедрите метод onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) в фрагменте
    • Внедрите onPreferenceClickListener как и для ChangeListener.

Извините, если это длинный пост. Это мое первое, и я прошел через столько страниц stackoverflow об этом, и никто не был точным, просто хотел, чтобы все было правильно;)

Я думаю, вы спрашиваете о функции, которой не существует.

Однако, поскольку в активности предпочтений используется listView, вы можете использовать некоторые трюки, чтобы настроить его и обрабатывать, как хотите.

Вот сообщение, которое я сделал о его настройке на основе этого веб-сайта . Что я спросил, как добавить listView, но я не знал, что активность предпочтений фактически использует listview.

После нескольких часов поиска я встретил пару сообщений, которые будут полезны другим в этой ситуации.

Это было решение, которое я выбрал для моей проблемы: как мне создать одно предпочтение с помощью EditTextPreference и Togglebutton?

Это очень подробный ответ и очень помогает в понимании предпочтений.

Другой столбец, с которым я столкнулся, был следующим: http://xgouchet.fr/android/index.php?article4/master-on-off-preferences-with-ice-cream-sandwich

Это даст вам в значительной степени тот же внешний вид и ощущение, что и выше, но требует больше работы и из-за моих требований не будет работать для меня.