2015년 2월 20일 금요일

Android ListPreference 항목 동적으로 변경하기

Android app의 settings(preference)를 구성하다보면
ListPreference의 항목들을 xml이 아닌 동적으로 업데이트 해줘야 할 필요가 생겨
이를 정리함.

우선 기본으로 봐야 하는 페이지..
Android Settings Documentation

[ListPreference의 항목을 채우는 방법]
by rochdev

Place preferences.xml in res/xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">

    <PreferenceCategory android:title="Some title">     

        <ListPreference android:key="default_category"
            android:title="Dynamic categories" android:summary="Dynamic categories summary"
            android:defaultValue="0" />
    </PreferenceCategory>
</PreferenceScreen>
In your activity that extends PreferenceActivity you do something like this in onCreate().
ListPreference listPreferenceCategory = (ListPreference) findPreference("default_category");
if (listPreferenceCategory != null) {
    ArrayList<Category> categoryList = getCategories();
    CharSequence entries[] = new String[categoryList.size()];
    CharSequence entryValues[] = new String[categoryList.size()];
    int i = 0;
    for (Category category : categoryList) {
        entries[i] = category.getCategoryName();
        entryValues[i] = Integer.toString(i);
        i++;
    }
    listPreferenceCategory.setEntries(entries);
    listPreferenceCategory.setEntryValues(entryValues);
}
shareimprove this answer


[Selected Item 설정]
보통 채우고 말것이 아니라
리스트 중 사용되고 있는 항목이 있다면 default value로 설정할 필요가 있음.
(SetDefaultValue()을 사용하면 삽질하게 된다...)

listSections.setValueIndex(항목의 index);



[Item 선택 시 처리]
그리고 list가 선택될 경우의 처리를 위해서 setOnPreferenceChangeListener 사용

listSections.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
   Log.d(LOG_TAG, "new section id = " + newValue.toString());
}
}

여기서 새롭게 선택된 값은 onPreferenceChange인자로 넘어오는 newValue 이며
이전에 선택된 item의 값은 listSections.getValue(), item title은 listSections.getEntry().

댓글 없음:

댓글 쓰기