2016-12-30 4 views
1

지난 번에 답변을 얻지 못했지만이 질문을 다시 게시하고 있습니다. 아직 문제가 해결되지 않았습니다.Android : SharedPreferences가 PreferenceFragment에서 업데이트되지 않음

나는 런타임 중에 많은 CheckBoxPreferences를 만드는 PreferenceScreen이있는 설정 메뉴가 있습니다 (이를 "제외 목록"선 스크린에 추가). 내 PreferenceFragment의에서 onCreate 방법의 체크 박스를 생성하고 "제외 목록"PreferenceScreen에 추가

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
    <PreferenceScreen 
     android:key="exclusion_list_key" 
     android:title="Exclusion List" 
     android:persistent="true" 
     android:summary="" > 
    </PreferenceScreen> 
</PreferenceScreen> 

하고 잘 작동 :로 시작하는 아래에 내가 그들에게 문제를 만들어, 여기에 XML 코드입니다.

"제외 목록"의 요약을 체크 표시가있는 모든 체크 박스 제목의 목록으로 설정하려고합니다 (확인란이 선택되어 있으면 해당 이름이 " 제외 목록 "참조).

onCreate() 메서드에서 요약을 제대로 설정하면 문제가 없습니다.

그러나 onPreferenceChanged() 메서드에서 "기본 설정"문자열 (올바른 값 포함)에 "제외 목록"요약을 설정했지만 업데이트하지 않았습니다! 내 체크 박스 메뉴에서 뒤로 누르면 "제외 목록"에 업데이트 된 값이 없습니다.

마지막 몇 줄이 관심의 대상입니다. ,

  1. 청취자가 잘 작동 내 요약 var에 setSummary (요약)를 호출 한 후

  2. 예상 무슨 포함

  3. 예상 때 실행되는 getSummary을 : 무슨 일인지보고 일부 printlns했다()는 예상 값을 반환합니다 (적절하게 설정되었음을 의미합니다).

  4. 그러나 실제로는 제외하고 "제외 목록"을 볼 때 요약 내용이 실제로 업데이트되지 않습니다!

내가 무엇을 놓쳤습니까? 미리 감사드립니다!

참조의 모든 코드 :

public class Settings extends AppCompatActivity { 

    public static final String EXC_LIST_KEY = "exclusion_list_key"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getFragmentManager().beginTransaction() 
       .replace(android.R.id.content, new SettingsFragment()) 
       .commit(); 
    } 

    public static class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      // Load the preferences from an XML resource 
      addPreferencesFromResource(R.xml.preferences); 
      String summary = ""; 

      //Create all the checkboxes inside of the PreferenceScreen 
      for (int i = 0; i < MainActivity.contactNames.length; i++) { 
       CheckBoxPreference checkbox = new CheckBoxPreference(getActivity()); 
       checkbox.setTitle(MainActivity.contactNames[i][0]); 
       checkbox.setKey(MainActivity.contactNames[i][2]); 
       checkbox.setSummary(MainActivity.contactNames[i][1]); 
       checkbox.setDefaultValue(false); 
       ((PreferenceScreen) findPreference(EXC_LIST_KEY)).addPreference(checkbox); 
       if (checkbox.isChecked()) { 
        summary = summary + checkbox.getTitle() + "\n"; 
       } 
      } 
      findPreference(EXC_LIST_KEY).setSummary(summary); 
      getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); 
     } 

     @Override 
     public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
      //Checkbox keys all start with 'key_' 
      if (key.startsWith("key_")) { 
       String summary = ""; 
       for (int i = 0; i < MainActivity.contactNames.length; i++) { 
        CheckBoxPreference checkbox = (CheckBoxPreference) findPreference(MainActivity.contactNames[i][2]); 
        if (checkbox.isChecked()) { 
         summary = summary + checkbox.getTitle() + "\n"; 
        } 
       } 
       System.out.println("Summary I have: " + summary); //Correct summary is printed out 
       findPreference(EXC_LIST_KEY).setSummary(summary); //Isn't updating the value??? 
       System.out.println("Summary system has: " + findPreference(EXC_LIST_KEY).getSummary()); //Correct summary is printed out 
      } 
     } 
    } 
} 

답변

0

에이 코드를 추가) 방법 :

((BaseAdapter)getPreferenceScreen().getRootAdapter()).notifyDataSetChanged(); 
0

시도 그것은 (내 onSharedPreferenceChanged의 끝에 다음 코드 줄을 추가하여 작업 당함 당신의 SettingsFragment

@Override 
public void onResume() { 
    super.onResume(); 

    SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); 

    // CHANGE 1: load saved values to set the summaries 
    onSharedPreferenceChanged(prefs, "exclusion_list_key"); 

    // CHANGE 2: register shared prefs listener in onResume 
    prefs.registerOnSharedPreferenceChangeListener(this); 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    SharedPreferences prefs = getPreferenceManager().getSharedPreferences(); 
    prefs.unregisterOnSharedPreferenceChangeListener(this); 
} 
+0

이것은 작동하지 않았습니다. – user1429039

관련 문제