설정 맞춤설정 Android Jetpack의 구성요소
이 문서에서는 계층 구조에서 Preference
객체를 맞춤설정하는 방법을 설명합니다.
환경설정 찾기
Preference
값을 가져오거나 설정하는 것과 같이 개별 Preference
에 액세스하려면 PreferenceFragmentCompat.findPreference()
를 사용합니다.
이 메서드는 지정된 키를 사용하여 Preference
의 전체 계층 구조를 검색합니다.
예를 들어 "signature"
키로 EditTextPreference
에 액세스하려면 다음을 실행합니다.
<EditTextPreference app:key="signature" app:title="Your signature"/>
다음 코드를 사용하여 이 Preference
를 검색합니다.
Kotlin
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences, rootKey) val signaturePreference: EditTextPreference? = findPreference("signature") // Do something with this preference. }
Java
@Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.preferences, rootKey); EditTextPreference signaturePreference = findPreference("signature"); // Do something with this preference. }
환경설정 공개 상태 제어
사용자가 설정 화면으로 이동할 때 사용자에게 표시할 Preference
객체를 제어할 수 있습니다. 예를 들어, 특정 기능이 사용 설정되어 있을 때만 그 기능에 상응하는 Preference
가 중요한 경우 그 기능이 사용 중지되면 Preference
를 숨기려고 할 수도 있습니다.
조건이 충족될 때만 Preference
를 표시하려면 먼저 다음 예와 같이 XML에서 Preference
공개 상태를 false로 설정합니다.
<EditTextPreference app:key="signature" app:title="Your signature" app:isPreferenceVisible="false"/>
onCreatePreferences()
에서 해당 조건이 충족되면 Preference
를 표시합니다.
Kotlin
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { setPreferencesFromResource(R.xml.preferences, rootKey) if(/*some feature*/) { val signaturePreference: EditTextPreference? = findPreference("signature") signaturePreference?.isVisible = true } }
Java
@Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { setPreferencesFromResource(R.xml.preferences, rootKey); if(/*some feature*/) { EditTextPreference signaturePreference = findPreference("signature"); if (signaturePreference != null) { signaturePreference.setVisible(true); } } }
동적으로 요약 업데이트
데이터를 유지하는 Preference
는 사용자가 Preference
의 현재 상태를 더 잘 이해할 수 있도록 요약에 현재 값을 표시해야 합니다. 예를 들어 EditTextPreference
는 저장된 텍스트 값을 표시해야 하고 ListPreference
는 선택한 목록 항목을 표시해야 합니다. 내부 또는 외부 앱 상태에 따라 요약을 업데이트해야 하는 Preference
객체가 있을 수도 있습니다(예: 버전 번호를 표시하는 Preference
). SummaryProvider
를 사용하면 됩니다.
SimpleSummaryProvider 사용
ListPreference
및 EditTextPreference
는 저장된 Preference
값을 요약으로 자동 표시하는 간단한 SummaryProvider
구현을 포함합니다. 저장된 값이 없으면 '설정되지 않음'이 표시됩니다.
XML에서 이러한 구현을 사용 설정하려면 app:useSimpleSummaryProvider="true"
를 설정하세요.
또는 다음 예와 같이 코드에서 ListPreference.SimpleSummaryProvider.getInstance()
및 EditTextPreference.SimpleSummaryProvider.getInstance()
를 사용하여 간단한 SummaryProvider
인스턴스를 가져온 다음 이를 Preference
에 설정할 수 있습니다.
Kotlin
listPreference.summaryProvider = ListPreference.SimpleSummaryProvider.getInstance() editTextPreference.summaryProvider = EditTextPreference.SimpleSummaryProvider.getInstance()
Java
listPreference.setSummaryProvider(ListPreference.SimpleSummaryProvider.getInstance()); editTextPreference.setSummaryProvider(EditTextPreference.SimpleSummaryProvider.getInstance());
맞춤 SummaryProvider 사용
Preference
에서 요약을 요청할 때마다 자체 SummaryProvider
를 만들고 provideSummary()
를 재정의하여 요약을 맞춤설정할 수 있습니다. 예를 들어 다음 EditTextPreference
는 저장된 값의 길이를 요약으로 표시합니다.
한 예로, 다음 EditTextPreference
를 가정해 보겠습니다.
<EditTextPreference app:key="counting" app:title="Counting preference"/>
onCreatePreferences()
에서 새 SummaryProvider
를 만들고 provideSummary()
를 재정의하여 표시할 요약을 반환할 수 있습니다.
Kotlin
val countingPreference: EditTextPreference? = findPreference("counting") countingPreference?.summaryProvider = SummaryProvider<EditTextPreference> { preference -> val text = preference.text if (text.isNullOrEmpty()) { "Not set" } else { "Length of saved value: " + text.length } }
Java
EditTextPreference countingPreference = findPreference("counting"); if (countingPreference != null) { countingPreference.setSummaryProvider(new SummaryProvider<EditTextPreference>() { @Override public CharSequence provideSummary(EditTextPreference preference) { String text = preference.getText(); if (TextUtils.isEmpty(text) || text == null){ return "Not set"; } return "Length of saved value: " + text.length(); } }); }
Preference
요약에는 저장된 값의 길이가 표시되며, 저장된 값이 없으면 '설정되지 않음'이 표시됩니다.
EditTextPreference 대화상자 맞춤설정
EditTextPreference
대화상자 내에서 OnBindEditTextListener
를 연결하여 텍스트 필드 동작을 맞춤설정할 수 있습니다.
이 리스너는 대화상자가 사용자에게 표시될 때 호출됩니다.
예를 들어, 숫자만 입력할 수 있도록 대화상자를 맞춤설정할 수 있습니다. 먼저 EditTextPreference
를 만듭니다.
<EditTextPreference app:key="number" app:title="Numbers only preference"/>
그런 다음 onCreatePreferences()
에서 새 OnBindEditTextListener
를 만들고 onBindEditText()
를 재정의하여 EditText
가 사용자에게 표시될 때 이를 맞춤설정합니다.
Kotlin
val numberPreference: EditTextPreference? = findPreference("number") numberPreference?.setOnBindEditTextListener { editText -> editText.inputType = InputType.TYPE_CLASS_NUMBER }
Java
EditTextPreference numberPreference = findPreference("number"); if (numberPreference != null) { numberPreference.setOnBindEditTextListener( new EditTextPreference.OnBindEditTextListener() { @Override public void onBindEditText(@NonNull EditText editText) { editText.setInputType(InputType.TYPE_CLASS_NUMBER); } }); }
이제 대화상자가 사용자에게 표시되면 키보드가 숫자 전용 모드로 열리므로 사용자는 EditText
에 숫자만 입력할 수 있습니다.
환경설정 작업
Preference
를 탭하면 특정 작업을 할 수 있습니다. 예를 들어 Preference
는 앱의 별도 부분에 관한 링크 역할을 할 수 있습니다. Preference
에 작업을 추가하려면 Preference
에 Intent
를 직접 설정하거나 더 구체적인 로직을 위해 OnPreferenceClickListener
를 설정하면 됩니다.
인텐트 설정
Preference
에 Intent
를 설정하여 Preference
를 탭할 때마다 새 Fragment
나 Activity
, 별도의 앱을 실행할 수 있습니다. 이는 Context.startActivity()
를 지정된 Intent
와 함께 사용하는 것과 같습니다.
중첩된 <intent>
태그를 사용하여 XML에 Intent
를 설정할 수 있습니다. 다음 예에서는 Activity
를 실행하는 Intent
를 정의합니다.
<Preference app:key="activity" app:title="Launch activity"> <intent android:targetPackage="com.example" android:targetClass="com.example.ExampleActivity"/> </Preference>
또는 다음과 같이 Preference
에서 직접 setIntent()
를 사용할 수 있습니다.
Kotlin
val intent = Intent(context, ExampleActivity::class.java) activityPreference.setIntent(intent)
Java
Intent intent = new Intent(getContext(), ExampleActivity.class); activityPreference.setIntent(intent);
XML을 사용하여 Intent
에 추가 항목을 포함할 수도 있습니다.
<Preference app:key="activity" app:title="Launch activity"> <intent android:targetPackage="com.example" android:targetClass="com.example.ExampleActivity"> <extra android:name="example_key" android:value="example_value"/> </intent> </Preference>
다음은 Intent
를 사용하여 웹페이지를 시작하는 Preference
의 예입니다.
<Preference app:key="webpage" app:title="View webpage"> <intent android:action="android.intent.action.VIEW" android:data="http://www.google.com" /> </Preference>
Kotlin
val intent = Intent(Intent.ACTION_VIEW) intent.data = Uri.parse("http://www.google.com") val webpagePreference = findPreference("webpage") webpagePreference?.intent = intent
Java
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.google.com")); webpagePreference.setIntent(intent);
OnPreferenceClickListener
Preference
에 OnPreferenceClickListener
를 설정하여 Preference
를 탭할 때 onPreferenceClick()
에 콜백을 추가할 수 있습니다. 예를 들어 탐색을 처리하는 더 복잡한 로직이 있다면 리스너를 사용하여 다른 Fragment
또는 Activity
로 이동할 수 있습니다.
OnPreferenceClickListener
를 설정하려면 다음과 유사한 코드를 사용합니다.
Kotlin
onClickPreference.setOnPreferenceClickListener({ // Do something. true })
Java
onClickPreference.setOnPreferenceClickListener(preference -> { // Do something. return true; });