티스토리 뷰
앱을 지우고 다시 설치하였을 때나 처음 앱을 설치하였을 때 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가 초기화 되기 전에도 정상적으로 의도한 값을 받아오도록 구현해보았습니다.
'개발 > 안드로이드' 카테고리의 다른 글
[android / 안드로이드] 리스트 비교하기 (0) | 2018.09.13 |
---|---|
[android / 안드로이드] ImageView를 ToggleButton처럼 사용하기 (0) | 2018.08.28 |
[안드로이드 / android] EditText & AppCompatEditText (0) | 2018.07.19 |
[안드로이드 / android] UiAutomatorviewer Window에서 실행되지 않는 문제 (0) | 2018.07.17 |
[안드로이드 / android] APK Version, App Version 설정 및 값 받아오기 (0) | 2018.07.16 |