설정 맞춤설정 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 사용

ListPreferenceEditTextPreference는 저장된 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 예를 보여주는 이미지
그림 1. 예: 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에 작업을 추가하려면 PreferenceIntent를 직접 설정하거나 더 구체적인 로직을 위해 OnPreferenceClickListener를 설정하면 됩니다.

인텐트 설정

PreferenceIntent를 설정하여 Preference를 탭할 때마다 새 FragmentActivity, 별도의 앱을 실행할 수 있습니다. 이는 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

PreferenceOnPreferenceClickListener를 설정하여 Preference를 탭할 때 onPreferenceClick()에 콜백을 추가할 수 있습니다. 예를 들어 탐색을 처리하는 더 복잡한 로직이 있다면 리스너를 사용하여 다른 Fragment 또는 Activity로 이동할 수 있습니다.

OnPreferenceClickListener를 설정하려면 다음과 유사한 코드를 사용합니다.

Kotlin

onClickPreference.setOnPreferenceClickListener({
    // Do something.
    true
})

Java

onClickPreference.setOnPreferenceClickListener(preference -> {
    // Do something.
    return true;
});