본문 바로가기

공부/Android

[Android] 환경설정 프래그먼트 / PreferenceFragmentCompat

참고 사이트


Keyword : PreferenceFragmentCompat


1. gradle 추가

implementation 'com.android.support:preference-v7:27.0.0'




2. value 디렉토리에 xml 디렉토리 생성 & settings_preference.xml 생성

: 이 xml 파일에 추가하고싶은 옵션 항목을 추가한다. 이 화면이 그대로 추가된다.





3. 나는 아직 푸시 알람 on/off 여부만 설정하는 옵션만 사용하기때문에 SwitchPreference 추가

[settings_preference.xml]

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

<SwitchPreferenceCompat
android:key="push_notification"
android:title="푸시 알람 on/off"
/>

</PreferenceScreen>

android:key에서 설정한 이름으로 SharedPreference에 저장되어서 이걸 사용할 수 있다나 뭐라나





4. 자바 코드 구현

: PreferenceFragment는 deprecate되어서 PreferenceFragmentCompat을 사용한다.

[SettingFragment.java]

public class SettingFragment extends PreferenceFragmentCompat {
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
addPreferencesFromResource(R.xml.settings_preference);
}
}

2번에서 생성한 settings_preference.xml을 화면에 띄워주는 것을 확인할 수 있다.





5. 위의 화면은 Fragment이기 때문에 Activity에 실제로 띄워주려면 FragmentManager로 replace 또는 add 해주어야한다.

[MainActivity.java]

: 일반적으로는 Fragment를 화면에 띄우려면 이런 식으로 Fragment를 인자로 넣어서 해당 Fragment를 띄워주는 방식을 사용한다.

private void replaceFragment(Fragment mFragment) {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction mTransaction = fm.beginTransaction();

mTransaction.replace(R.id.main_fragment, mFragment);
mTransaction.commit();
}

하지만 우리의 SettingFragment.java는 그냥 Fragment가 아닌 PreferenceFragmentCompat 이므로 따로 이것만 띄워주는 메소드를 생성하였다. 음 낭비...

private void replaceSettingFragment() {
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction mTransaction = fm.beginTransaction();

mTransaction.replace(R.id.main_fragment, new SettingFragment());
mTransaction.commit();
}



6. 마지막으로, 이 환경설정 화면의 style을 설정해주어야한다.

[styles.xml]

<resources>

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="preferenceTheme">@style/PreferenceLocaleTheme</item>
</style>

<style name="PreferenceLocaleTheme" parent="@style/PreferenceThemeOverlay"/>

</resource>





7. 최종화면