설정 Android Jetpack의 구성요소
설정을 통해 사용자는 앱의 기능과 동작을 변경할 수 있습니다. 설정은 앱이 데이터를 클라우드와 동기화하는 빈도와 같은 백그라운드 동작에 영향을 미치거나 사용자 인터페이스의 콘텐츠와 표시를 변경하는 등 광범위하게 적용될 수 있습니다.
사용자가 구성 가능한 설정을 앱에 통합하려면 AndroidX 환경설정 라이브러리를 사용하세요. 이 라이브러리는 사용자 인터페이스를 관리하고 저장소와 상호작용하므로 사용자가 구성할 수 있는 개별 설정만 정의합니다. 이 라이브러리는 모든 기기와 OS 버전에 걸쳐 일관적인 사용자 환경을 제공하는 Material Design 테마와 함께 제공됩니다.
시작하기
Preference
는 Preference 라이브러리의 기본 구성요소입니다. 설정 화면에는 Preference
계층 구조가 있습니다. 이 계층 구조를 XML 리소스로 정의하거나 코드로 계층 구조를 빌드할 수 있습니다.
다음 섹션에서는 AndroidX 환경설정 라이브러리를 사용하여 간단한 설정 화면을 빌드하는 방법을 설명합니다.
시작하기 전에 build.gradle
파일에 환경설정 라이브러리 종속 항목을 추가합니다.
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) } }
Java
public class MySettingsFragment extends PreferenceFragmentCompat { @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.preferences, rootKey); } }
그런 다음 다른 Fragment
와 마찬가지로 이 Fragment
를 Activity
에 추가할 수 있습니다.
Kotlin
class MySettingsActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) supportFragmentManager .beginTransaction() .replace(R.id.settings_container, MySettingsFragment()) .commit() } }
Java
public class MySettingsActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getSupportFragmentManager() .beginTransaction() .replace(R.id.settings_container, new MySettingsFragment()) .commit(); } }
결과는 다음 이미지에 나와 있습니다.
환경설정 모니터링
환경설정이 변경될 때 리스너를 등록하여 이벤트를 가져올 수 있습니다.
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. }
Java
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}") }
Java
var preferences = PreferenceManager.getDefaultSharedPreferences(context).getAll(); preferences.forEach((key, value) ->{ Log.d("Preferences", String.format("%s -> %s", key, value)); });
이전 스니펫은 앱의 기본 SharedPreferences
인스턴스를 가져오고 저장된 모든 값에 액세스하여 루프 처리하고 Logcat에 출력합니다.