티스토리 뷰

반응형

앱을 지우고 다시 설치하였을 때나 처음 앱을 설치하였을 때 SharedPreferences에서 값을 읽어오지 못하는 경우가 있습니다.

보통 설정을 위한 Activity나 Fragment의 onCreatePreferences에서 Prefenences의 초기화를 진행하는데, 이 코드가 타기 전에 값을 읽으려 할 경우에 실패를 하게 됩니다.

@Override
public void onCreatePreferences(Bundle bundle, String s) {
addPreferencesFromResource(R.xml.preference);
}

xml에 preference항목을 정의하고 위와 같이 preference값들을 추가해줘야 비로서 값을 정상적으로 읽어올 수 있습니다.


해결 방법은 두가지가 있습니다.

먼저 가장 처음 실행되는 activity에서 미리 preference를 초기화 해주면 됩니다.

PreferenceManager.setDefaultValues(this, R.xml.preference, false);

바로 위와 같이 preference가 정의된 xml을 통해 default값을 설정하는 것입니다.

다른 방법으로는 preference에서 값을 읽어올 때 정의된 값을 그대로 읽어오도록 디폴트 값을 잘 설정해 줘야 합니다. (preference를 읽는건 잘되나 쓰는게 안되기때문에 첫번째 방법을 추천합니다.)

string, float, int 등의 기본형 변수의 경우 별 어려움 없이 쓰실 수 있을 것 같아 getStringSet의 기본 값 설정에 대 해서만 알아보겠습니다.

먼저 strings.xml에 아래와 같이 default_xxxx에해당하는 string-array가 정의 되어있다고 가정하겠습니다. 이 array값들은 preferences 초기화 때 사용되는 array값들로 디폴트 값으로 써도 문제가 없습니다.

<string-array name="default_xxxx">
<item>xx1</item>
<item>xx2</item>
<item>xx3</item>
<item>xx4</item>
<item>xx5</item>
<item>xx6</item>
<item>xx7</item>
<item>xx8</item>
<item>xx9</item>
</string-array>


그럼 이제 getStringSet에 디폴트 값을 설정하는 코드를 보겠습니다.

String[] defaultList = context.getResources().getStringArray(R.array.default_community);

SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(context);
Set<String> selections = sharedPrefs.getStringSet(context.getResources().getString(R.string.preference_key_board_chooser), new HashSet<>(Arrays.asList(defaultList)));

실제 코드에서는 getStringArray를 통해 String array를 받아오고, 다시 Arrays.asList를 통해 Set<String>으로 변환하였습니다
이 값을 getStringSet의 두번째 매개변수에 넣어주면 읽기가 실패했을 때 해당 값으로 반환해주게 됩니다.


이렇게 preferences 값을 읽어오는 코드에 디폴트 값을 넣어주어 preferences가 초기화 되기 전에도 정상적으로 의도한 값을 받아오도록 구현해보았습니다.
 


반응형
댓글
공지사항
최근에 올라온 글