Preferences 앱 설정화면

with PreferenceFragmentCompat


PreferenceActivity를 사용하려고 했는데 API 29부터는 deprecated 되기 때문에 대안으로

PreferenceFragmentCompat을 이용해서 사용할 수 있습니다.

PreferenceFragmentCompat은 Activity가 아니라서 AndroidManifest에 등록이 되지 않습니다.

해결방법은 AppCompatActivity를 상속한 레이아웃을 만들어서 android:name으로 클래스를 선언해주시면 됩니다.

 

 


 gradle 추가

∨ Toolbar 생성 및 설정

 menu 생성

∨ onCreateOptionsMenu, onOptionItemSelected 메서드 오버라이드

res/xml/user_preference.xml 파일생성 & PreferenceFragmentCompat 상속받은 UserPreferences 클래스 생성

∨ res/layout/preferences.xml 파일생성 & AppCompatActivity 상속받은 PreferencesActivity 클래스 생성

∨ manifest.xml에 해당 Activity 추가


 

implementation 'androidx.preference:preference:1.1.0'

gradle에 preference 추가.

 

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
// 툴바 설정
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

xml에 Toolbar 추가하고 java파일에 설정.

 

res 우클릭 - New - Android Resource Directory에서 menu 폴더를 생성해줍니다.

생성한 menu폴더 우클릭 - New - Menu Resource File로 원하는 이름으로 메뉴 xml 파일을 생성해주세요.

 

menu_main.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/action_settings"
        android:title="settings"
        android:icon="@drawable/ic_baseline_settings_24"
        app:showAsAction="always"/>
</menu>

생성한 menu파일에 추가하려는 버튼을 item으로 추가시킵니다.

app:showAsAction은 액션바에 바로 보이게하거나 버튼을 눌렀을 때 보이게하도록 설정할 수 있습니다.

 

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {

        switch (item.getItemId()){
            case R.id.action_settings:
                startActivity(new Intent(this, PreferencesActivity.class));
                break;
        }
        return super.onOptionsItemSelected(item);
    }

onCreateOptionMenu와 onOPtionsItemSelected를 오버라이드 해줍니다.

onCreateOptionMenu로 액션바에 메뉴를 추가하고,

onOptionsItemSelected로 해당 버튼을 클릭했을 때 수행할 코드를 작성시켜줍니다.

버튼이 하나일 경우에는 if로 간단하게 하셔도 됩니다. 여러개일 경우에는 위와 같이 switch case로 하시면 됩니다.

 

 

UserPreferences.java

public class UserPreferences extends PreferenceFragmentCompat {
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource(R.xml.user_preferences, rootKey);
    }
}

PreferenceFragmentCompat을 상속한 클래스를 생성합니다.

 

user_preferences.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:app="http://schemas.android.com/apk/res-auto">
    <PreferenceCategory
        app:key="notifications_category"
        app:title="Notifications">
        <SwitchPreferenceCompat
            app:key="notifications"
            app:title="알림"/>
        <CheckBoxPreference
            app:title="체크박스"/>
    </PreferenceCategory>
    <PreferenceCategory
        app:key="help_category"
        app:title="Help">
        <Preference
            app:key="feedback"
            app:summary="Report technical issues or suggest new features"
            app:title="Send feedback"/>
    </PreferenceCategory>
</PreferenceScreen>

res 우클릭 - New - Android Resource Directory로 xml 폴더 생성.

xml 폴더 우클릭해서 root element를 PreferenceScreen로 해서 xml파일을 생성.

스위치, 체크박스 등 설정이 가능하고, 카테고리로 지정해서 묶을수도 있습니다.

 

PreferencesActivity.java

public class PreferencesActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.preferences);
    }
}

AppCompatActivity를 상속한 클래스를 생성합니다.

 

preferences.xml

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

    <fragment
    	android:id="@+id/settings_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="클래스명"/>

</FrameLayout>

res/layout에 xml파일을 생성합니다.

FrameLayout에 fragment를 만들고 android:name에 PreferenceFragmentCompat을 상속받은 클래스명을 입력해주시면 됩니다.

(settings_container로 id 설정 안해주시면 에러 발생합니다.)

 

<activity android:name=".PreferencesActivity"/>

manifest에 activity를 추가해줍니다. AppCompatActivity가 상속된!

 

 

preferences 파일이 여러개여서 혼동이 올 수 있으니 유의하세요.


+ Recent posts