레이블이 preferencefragment인 게시물을 표시합니다. 모든 게시물 표시
레이블이 preferencefragment인 게시물을 표시합니다. 모든 게시물 표시

2017년 1월 3일 화요일

PreferenceFragment, PreferenceFragmentCompat

꽤나 오래전에 만들었던 App에서
PreferenceFragment를 사용하여 앱 설정을 만들었었으나
나중에 android support library를 사용하여 android.support.v4.app.Fragment를 상속하여 view들을 만들어 관리 했었는데 android.app.Fragment를 상속하여 만든 PreferenceFragment를 사용하는데 문제가 있어 대충 귀찮아서 그냥 상위 버전의 support library로 업데이트 하여 사용했던 적이 있었음. (좀 후회됨....)

이 상황은 android support library v7의 PreferenceFragmentCompat를 사용하면 된다.

PreferenceFragmentCompat


Preference API Guide


위 링크에서는 PreferenceFragment를 사용하고 있으나 이를 android.support.v7.preference.PreferenceFragmentCompat 변경해서 사용해야 함.

또한 다른 점으로
PreferenceFragment은 OnCreate()가 처음 호출되어 preference page를 구성하지만  PreferenceFragmentCompat은 onCreatePreferences()가 처음 호출 되므로 onCreatePreferences()에서 page를 구성해야 한다.

Gradle Build Script Dependency

그리고 해당 preference andorid support libary를 사용하고자 할 경우
아래 링크에서 Gradle 빌드 스크립트 종속성 식별자를 정확하게 App의 project structure > dependency 에 입력하여 추가하여 사용해야 한다. 그냥 대충 검색하니 안나오더라..


v7 Preference 지원 라이브러리

preference 패키지는 사용자가 UI 설정을 수정하도록 CheckBoxPreference 및 ListPreference와 같은 기본 설정 객체 추가를 지원하는 API를 제공합니다.
v7 Preference 라이브러리는 Preference.OnPreferenceChangeListener 및 Preference.OnPreferenceClickListener와 같은 인터페이스와 CheckBoxPreference 및 ListPreference와 같은 클래스에 대한 지원을 추가합니다.
이 라이브러리에 대한 Gradle 빌드 스크립트 종속성 식별자는 다음과 같습니다.
com.android.support:preference-v7:24.2.0

No resource found that matches the given name (at 'id' with value '@android:id/list_container')

혹시나 빌드 중 위와 같은 에러가 발생한다면
임시 방편으로 아래 링크 마지막에서 언급된 것 처럼 app의 compileSdkVersion을 24 (7.0)로 설정하면 빌드 된다.





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().

2014년 2월 21일 금요일

support v4 library 사용 중 PreferenceFragment를 FragmentPagerAdapter 추가 시 문제점

하위 기기 호환을 위해서 android support v4 library
(http://developer.android.com/tools/support-library/index.html)를 사용하여
fragment들을 사용, 관리하고 있는 중에
preference fragment를 fragmentPagerAdapter에 추가 시 문제가 발생함.

android.support.v4.app.FragmentPagerAdapter 에서는
android.support.v4.app.Fragment 를 처리하고 있어
android.app.Fragment를 상속받은 PreferenceFragment을
v4.appFragment로 처리 할 수 없음.

좀 찾아봤으나 어쩔 수 없이 v13 library를 사용하는 것으로 마무리..
더 찾기도 귀찮음.

http://stackoverflow.com/questions/15845632/adding-preferencefragment-to-fragmentpageradapter

This answer led me to the solution of using the v13 support library, which includes a FragmentPagerAdapter that uses bona-fide android.app.Fragments so it can support the PreferenceFragment.
Assuming you use Eclipse and run the new app wizard with the "Scrollable Tabs + Swipe" Navigation (which gives you the v4 pager boilerplate), here are the modifications you need to make to upgrade to v13:
  • Delete "android-support-v4.jar" file from your libs folder
  • Copy "android-support-v13.jar" from SDK_PATH\extras\android\support\v13; if it's not there, use the SDK manager to install or update "Extras/Android Support Library"
Then, in the Java file:
  • Change FragmentPagerAdapter import from v4 to v13
  • Change FragmentActivity to a plain Activity
  • Change calls to getSupportFragmentManager to getFragmentManager
  • Import all necessary classes from android.app instead of android.support.v4
  • (Except: you still need to use the v4 ViewPager, but it's compatible)
I've copied the modified source below, verified on latest Jellybean.