설정 맞춤설정  Android Jetpack의 구성요소

이 주제에서는 계층 구조에서 Preferences를 맞춤설정하는 방법을 설명합니다.

환경설정 찾기

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
}

자바

@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
    setPreferencesFromResource(R.xml.preferences, rootKey);
    EditTextPreference signaturePreference = findPreference("signature");
    // do something with this preference
}

환경설정 공개 상태 제어

설정 화면으로 이동할 때 사용자에게 공개할 Preferences를 제어할 수 있습니다. 예를 들어, 특정 기능이 사용 설정되어 있을 때만 그 기능에 상응하는 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
    }
}

자바

@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는 현재 선택된 목록 항목을 표시해야 합니다. 또한, 내부 또는 외부 앱 상태에 따라 요약을 업데이트해야 하는 Preferences(예: 버전 번호를 표시하는 Preference)가 있을 수도 있습니다. 이 작업은 SummaryProvider를 사용하여 실행하면 됩니다.

SimpleSummaryProvider 사용

ListPreferenceEditTextPreference는 저장된 Preference 값을 요약으로 자동 표시하는 간단한 SummaryProvider 구현을 포함합니다. 저장된 값이 없으면 '설정되지 않음'을 표시합니다.

app:useSimpleSummaryProvider="true"를 설정하여 XML에서 이러한 구현을 사용 설정할 수 있습니다.

또는 다음 예와 같이 코드에서 ListPreference.SimpleSummaryProvider.getInstance()EditTextPreference.SimpleSummaryProvider.getInstance()를 사용하여 간단한 SummaryProvider 인스턴스를 가져온 다음 이를 Preference에 설정할 수 있습니다.

Kotlin

listPreference.summaryProvider = ListPreference.SimpleSummaryProvider.getInstance()
editTextPreference.summaryProvider = EditTextPreference.SimpleSummaryProvider.getInstance()

자바

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 (TextUtils.isEmpty(text)) {
        "Not set"
    } else {
        "Length of saved value: " + text.length
    }
}

자바

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)){
                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를 만들고 EditText를 맞춤설정하도록 onBindEditText()를 재정의합니다.

Kotlin

val numberPreference: EditTextPreference? = findPreference("number")

numberPreference?.setOnBindEditTextListener { editText ->
    editText.inputType = InputType.TYPE_CLASS_NUMBER
}

자바

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를 설정할 수 있습니다.

인텐트 설정

Preference를 탭할 때마다 새 Fragment, Activity 또는 별도 애플리케이션을 시작하도록 PreferenceIntent를 설정할 수 있습니다. 이 방식은 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>

또는, 아래와 같이 직접 PreferencesetIntent()를 사용할 수 있습니다.

Kotlin

val intent = Intent(context, ExampleActivity::class.java)
activityPreference.setIntent(intent)

자바

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")
webpagePreference.setIntent(intent)

자바

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
})

자바

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