У меня есть основное действие, которое загружает PreferenceFragment (его часть actionBar).Предпочтение в PreferenceFragment не обновляется
В PreferenceFragment я загружаю свои предпочтения из XML-файла:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
}
Проблема заключается в том, если я изменю Tab (помните, это становится управляется ActionBar), изменить одно из предпочтений в другой фрагмент и возвращаясь к моему предпочтениюFragment, он не обновляется. В частности, проблема заключается в SwitchPreference (true/false), который может быть изменен из разных фрагментов и даже с помощью удаленных вызовов (тогда предпочтение изменяется в общих предпочтениях. ДА Я сделал фиксацию изменения).
Я искал разные решения, но, честно говоря, я не нашел рабочий. Мои собственные идеи следующие:
Моя проблема была бы решена, если бы я мог получить элемент переключателя коммутатора, поэтому я мог бы установить переключатель в true в методе onStart() или onResume(). Но есть ли изменения, чтобы получить объект Switch? Если бы я загрузить обычную схему я мог бы получить доступ к коммутатору, как это:
View v = inflater.inflate(R.layout.start_fragment, container, false);
Switch status = (Switch) v.findViewById(R.id.switch1);
После этого я смог бы установить положение переключателя, как это:
status.setChecked(true);
Другим решением было бы уничтожить фактическое представление и снова вызвать addPreferencesFromResource(), но, честно говоря, я понятия не имею, как это можно сделать.
Третьим решением может быть использование OnCheckedChangeListener в моем PreferenceFragment, но проблема снова будеткак изменить/обновить коммутатор.
Я уверен, что предпочтение обновлено правильно, потому что я запускаю OnSharedPreferenceChangeListener в одной из моих служб и для отладки этой проблемы я заставил слушателя зарегистрировать статус моего switchPreference.
Вы можете мне как-то помочь?
, к сожалению, я не могу ответить на мой собственный вопрос, прежде чем завтра утром, так что я изменить мой вопрос:
Спасибо вам, ребята, я не хочу, чтобы перезапустить основную деятельность, но только фрагмент.
К счастью, я нашел ключ в этой теме: How do you refresh PreferenceActivity to show changes in the settings?
я действительно могу получить доступ к SwitchPreference просто. Мое решение:
private SwitchPreference pref_phone_locked;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
status = (SwitchPreference) findPreference("status");
}
public void onStart(){
super.onStart();
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity());
if(sharedPref.getBoolean("status", false)){
status.setChecked(true);
}else{
status.setChecked(false);
}
}
Таким образом, я могу просто бросить предпочтение SwitchPreference и изменить его после каждого вызова OnStart(). Я думаю, это лучшее решение для моей проблемы.
Надеюсь, этот ответ сэкономит время в будущем =) Спасибо вам, ребята, снова!
Вы добавляете слушателя на любые изменения, используя registerOnSharedPreferenceChangeListener и добавление onSharedPreferenceChanged обратного вызова? – random
Iam добавление слушателя, да. В основном, чтобы получать изменения в сервисе (так что не связано с моей текущей проблемой). Значение SharedPreference моего переключателя успешно изменено -> не имеет значения, если я изменю его в PreferenceFragment или в другом фрагменте => Я могу поймать изменения внутри моего OnSharedPreferenceChangeListener. Я просто понял, что написал в своем оригинальном посте OnCheckedChangeListener. Конечно, Iam запускает OnSharedPreferenceChangeListener, а не OnCheckedChangeListener в моей службе. Сейчас я отредактирую это. – Christmu
Я думаю, что проблема связана с тем, как построен фрагмент. Если я вызываю addPreferencesFromResource() в onStart(), я получаю правильную позицию переключателя, но, конечно, ее также реплицирует весь экран настроек ... знаете ли вы, как перестроить представление изнутри фрагмента? – Christmu