* 이 문서는 PreferenceActivity Android 4.0 or higher (StackOverFlow) (http://stackoverflow.com/questions/10186697/preferenceactivity-android-4-0-and-earlier/) 에서 가져온 내용이며, 실제 사용하기 위해 일부 개조를 거쳤음을 알려드립니다 *
안녕하세요, 잉여 메인테이너 소피아네입니다.
앱을 개발하던 도중 환경설정으로 깔끔하게 하면 어떨까 싶어서 안드로이드 4.0 책을 꺼내서 환경설정 그대로 쳤습니다.
prefs.xml 구성하고 딱 쳐서 아싸! 하고 있었던 것 쯤에
The method addPreferencesFromResource(int) from the type PreferenceActivity is deprecated
addPreferecesFromResource가 API 11(허니콤)부터 지원되지 않습니다.
=ㅅ=?
야.
책에도 이렇게 하라고 써있는데? 장난해?
해서 여러가지 방법을 찾는데 이거 의외로 안나오더라고요 =ㅅ; developer.android.com에서 한개, 그리고 위 stackoverflow가 전부였습니다.
그래서 여러분에게, 제가 약 3시간동안 했던 삽질의 비법을 알려드립니다. <<퍽
일단 적용 사진을 보시죠.
제가 언어도 제대로 배우지 않은 잉여라 이정도가 한계였지만 됬네요 =ㅅ;
자, 그럼 잘 따라오시길!
재료란 Preference를 말합니다.
근데 여기서 책에서 하던 카테고리를 다른 방법으로 써야됩니다.
예전이면
<PreferenceCategory
...
<Preference
...
이렇게 했었을겁니다.
이제 카테코리는 집어서 던지면 되겠습니다.
즉, 이렇게요.
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<CheckBoxPreference
android:defaultValue="true"
android:key="bootcheck"
android:summary="@string/settingbootchecksub"
android:title="@string/settingbootcheck" />
<Preference
android:key="delete"
android:summary="@string/settingappdeletesub"
android:title="@string/settingappdelete" />
</PreferenceScreen>
PreferenceScreen 바로 밑에 CheckBox나 Preference 같은 설정에 뜨는걸 넣어주세요.
카테고리를 이제 파일로 분류 하시면 됩니다.
다 구성했으면 이제 res/xml에 preference_headers.xml 라는 파일을 만들어줍시다.
이 파일이 핵심인데요, 사진의 두번째처럼 되게 해주는 겁니다.
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android" >
<header android:fragment="자신의 패키지 이름.PrefsFragment"
android:title="@string/settingtitle">
<extra android:name="resource" android:value="preferences" />
</header>
<header android:fragment="자신의 패키지 이름.PrefsOpenSource"
android:title="@string/settingsub2">
<extra android:name="resource" android:value="preferences" />
</header>
</preference-headers>
구성하는 방법은
<header android:fragment="자신의 패키지 이름.PrefsFragment"
android:title="@string/settingtitle">
<extra android:name="resource" android:value="preferences" />
</header>
입니다.
카테고리, 즉 파일이 여러개일경우 저처럼 선언해주세요. (저의 경우 PrefsFragment와 PrefsOpenSource로 했습니다)
자 이제 그럼 위에 쓴 PrefsFragment를 만들러가야겠죠?
당장 만듭시다.
@TargetApi(Build.VERSION_CODES.HONEYCOMB) // 허니콤 이상에서 사용 가능하다는 것입니다.
public class PrefsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_settings ); 아까 선언한 대로 PrefsFragment 항목을 누르면 무슨 설정을 띄울건지 결정합니다.
}
}
저의 경우 두개(PrefsOpenSource가 있죠)니까 PrefsOpenSource도 따로 만들었습니다.
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public class PrefsOpenSource extends PreferenceFragment {
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_opensource );
}
}
내용인 즉슨 굵은 표시가 중요한겁니다.
4. Android 3.0 or higher = Fragment, 그 이하 Activity를 판가름하기
여기서는 두개의 클래스가 필요합니다. 그대로 선언해주세요.
PreferencesActivity 와 OtherPreferencesActivity 입니다.
먼저 PreferencesActivity에는
public class PreferencesActivity extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResourc e(R.xml.pref_settings);
addPreferencesFromResource (R.xml.pref_opensource); // 줄 쳐져있어도 상관하지 마세요, PreferencesActivity는 3.0 미만이 쓸겁니다. 당연히 타겟 api는 이거보다 더 높으니 줄이 쳐져있죠.
}
}
그다음 OtherPreferencesActivity에는
import java.util.List;
public class OtherPreferencesActivity extends PreferenceActivity {
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public void onBuildHeaders(List<Header> target) {
loadHeadersFromResource(R.xml.preference_headers, target);
}
}
이렇게 선언해주시면 설정화면 구성은 끝났습니다.
이제 Intent를 해야겠는데... 어떻게 하냐고요?
if (Build.VERSION.SDK_INT < 11) {
startActivity(new Intent(this, PreferencesActivity.class));
} else {
startActivity(new Intent(this, OtherPreferencesActivity.class));
}
이렇게 하시면 됩니다.
기준 API가 11보다 낮을 경우 PreferencesActivity(아까 줄이 쳐져있어도 신경 끈거), 높을 경우 OtherPreferencesActivity를 띄웁니다.
여기까지입니다.
글을 상당히 휘갈겨 써서 이해하신 분 있는지 모르겠지만 이해하신분 대단하십니다.
이제 PreferencesActivity와 각 PrefsFragment(와 PrefsOpenSource)에 클릭 이벤트나 그런 걸 넣으시면 되겠습니다.
그럼 바이니~
Creative Commons License
RECENT COMMENT