설정   Android Jetpack의 구성요소

설정을 사용하면 사용자가 앱의 기능과 동작을 변경할 수 있습니다. 설정은 앱이 데이터를 클라우드와 동기화하는 빈도와 같은 백그라운드 동작에 영향을 미치거나 사용자 인터페이스의 콘텐츠 및 표시 방식을 변경하는 등 더 광범위하게 적용될 수 있습니다.

사용자가 구성 가능한 설정을 앱에 통합하려면 AndroidX 환경설정 라이브러리를 사용합니다. 이 라이브러리는 사용자 인터페이스를 관리하고 저장소와 상호작용하여 사용자가 구성할 수 있는 개별 설정만 정의합니다. 이 라이브러리에는 모든 기기와 OS 버전에 일관적인 사용자 환경을 제공하는 머티리얼 디자인 테마가 있습니다.

시작하기

Preference는 Preference 라이브러리의 기본 구성요소입니다. 설정 화면에는 Preference 계층 구조가 포함되어 있습니다. 이 계층 구조를 XML 리소스로 정의하거나 코드로 계층 구조를 빌드할 수 있습니다.

다음 섹션에서는 AndroidX Preference 라이브러리를 사용하여 간단한 설정 화면을 빌드하는 방법을 설명합니다.

시작하기 전에 build.gradle 파일에 Preference 라이브러리 종속 항목을 추가합니다.

Groovy

dependencies {
    implementation "androidx.preference:preference-ktx:1.2.0"
}

Kotlin

dependencies {
    implementation("androidx.preference:preference-ktx:1.2.0")
}

Gradle 동기화가 완료되면 태스크의 XML 부분으로 이동할 수 있습니다.

계층 구조 만들기

프로젝트에서 res/xml 폴더로 이동하여 preferences.xml 파일을 만들고 다음 코드를 추가합니다.

<PreferenceScreen
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <SwitchPreferenceCompat
        app:key="notifications"
        app:title="Enable message notifications"/>

    <Preference
        app:key="feedback"
        app:title="Send feedback"
        app:summary="Report technical issues or suggest new features"/>

</PreferenceScreen>

이 계층 구조에는 두 개의 Preference 객체가 포함되어 있습니다. 하나는 사용자가 설정을 켜거나 끌 수 있는 SwitchPreferenceCompat이고 다른 하나는 위젯이 없는 기본 Preference입니다.

계층 구조를 빌드할 때 각 Preference에는 고유 키가 있어야 합니다.

계층 구조 확장

XML 속성에서 계층 구조를 확장하려면 다음 예와 같이 PreferenceFragmentCompat를 만들고 onCreatePreferences()를 재정의하여 확장하기 위한 XML 리소스를 제공하세요.

Kotlin

class MySettingsFragment : PreferenceFragmentCompat() {
    override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        setPreferencesFromResource(R.xml.preferences, rootKey)
    }
}

자바

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

그런 다음 다른 Fragment를 사용할 때와 마찬가지로 이 FragmentActivity에 추가할 수 있습니다.

Kotlin

class MySettingsActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        supportFragmentManager
                .beginTransaction()
                .replace(R.id.settings_container, MySettingsFragment())
                .commit()
    }
}

자바

public class MySettingsActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.settings_container, new MySettingsFragment())
                .commit();
    }
}

결과는 다음 이미지와 같습니다.

환경설정 화면의 예를 보여주는 이미지
그림 1. 두 개의 Preference 객체를 사용하여 만든 설정 화면

환경설정 모니터링

환경설정에 리스너를 등록하여 환경설정이 변경될 때 이벤트를 가져올 수 있습니다.

Kotlin

findPreference<SwitchPreferenceCompat>("notifications")
    ?.setOnPreferenceChangeListener { _, newValue ->
        Log.d("Preferences", "Notifications enabled: $newValue")
        true // Return true if the event is handled.
    }

findPreference<Preference>("feedback")
    ?.setOnPreferenceClickListener {
        Log.d("Preferences", "Feedback was clicked")
        true // Return true if the click is handled.
    }

자바

SwitchPreferenceCompat notificationsPref = findPreference("notifications");

if (notificationsPref != null) {
    notificationsPref.setOnPreferenceChangeListener((preference, newValue) -> {
        Log.d("Preferences", String.format("Notifications enabled: %s", newValue));
        return true; // Return true if the event is handled.
    });
}

Preference feedbackPref = findPreference("feedback");

if (feedbackPref != null) {
    feedbackPref.setOnPreferenceClickListener((preference) -> {
        Log.d("Preferences", "Feedback was clicked");
        return true; // Return true if the event is handled.
    });
}

현재 환경설정 값 읽기

PreferenceFragmentCompat는 환경설정을 저장하고 읽는 데 관련된 대부분의 메커니즘을 숨깁니다. 하지만 모든 항목은 SharedPreferences를 사용하여 저장되며 평소와 같이 SharedPreferences를 사용하여 이러한 값을 읽을 수 있습니다.

Kotlin

val preferences = PreferenceManager.getDefaultSharedPreferences(this).all

preferences.forEach {
    Log.d("Preferences", "${it.key} -> ${it.value}")
}

자바

var preferences = PreferenceManager.getDefaultSharedPreferences(context).getAll();

preferences.forEach((key, value) ->{
    Log.d("Preferences", String.format("%s -> %s", key, value));
});

이전 스니펫은 앱의 기본 SharedPreferences 인스턴스를 가져와 저장된 모든 값에 액세스하고, 이를 반복하여 Logcat에 출력합니다.