2014-02-18 6 views
1

У меня есть основное действие, которое загружает 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(). Я думаю, это лучшее решение для моей проблемы.

Надеюсь, этот ответ сэкономит время в будущем =) Спасибо вам, ребята, снова!

+0

Вы добавляете слушателя на любые изменения, используя registerOnSharedPreferenceChangeListener и добавление onSharedPreferenceChanged обратного вызова? – random

+0

Iam добавление слушателя, да. В основном, чтобы получать изменения в сервисе (так что не связано с моей текущей проблемой). Значение SharedPreference моего переключателя успешно изменено -> не имеет значения, если я изменю его в PreferenceFragment или в другом фрагменте => Я могу поймать изменения внутри моего OnSharedPreferenceChangeListener. Я просто понял, что написал в своем оригинальном посте OnCheckedChangeListener. Конечно, Iam запускает OnSharedPreferenceChangeListener, а не OnCheckedChangeListener в моей службе. Сейчас я отредактирую это. – Christmu

+0

Я думаю, что проблема связана с тем, как построен фрагмент. Если я вызываю addPreferencesFromResource() в onStart(), я получаю правильную позицию переключателя, но, конечно, ее также реплицирует весь экран настроек ... знаете ли вы, как перестроить представление изнутри фрагмента? – Christmu

ответ

0

Я не уверен, если это будет работать для вас (я имею очень простой Knowlege Андроида), но я нашел это решение в подобном вопросе, и она работает очень хорошо для меня

private void simulateRefresh(){ 
    Intent intent = getIntent(); 
    overridePendingTransition(0, 0); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
    finish(); 
    overridePendingTransition(0, 0); 
    startActivity(intent); 
} 

В основном это разрушает и воссоздает активность без анимации между ними.

Найдено here

+0

Я выложу ссылку на оригинальные aswers, как только я ее смогу найти, все кредиты идут на оригинальный плакат. – LucaD

+0

Спасибо за помощь. Наконец, я нашел другое решение, но мне пришлось отредактировать свой вопрос, потому что я не позволю отвечать на свой вопрос до завтрашнего утра. – Christmu

Смежные вопросы