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

이 문서에서는 계층 구조의 Preference 객체

환경설정 찾기

Preference 값을 가져오거나 설정하는 것과 같이 개별 Preference에 액세스하려면 PreferenceFragmentCompat.findPreference()를 사용합니다. 이 메서드는 지정된 키를 사용하여 Preference의 전체 계층 구조를 검색합니다.

예를 들어 EditTextPreference 키를 "signature"으로 사용하려면 다음 단계를 따르세요.

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

환경설정 공개 상태 제어

사용자에게 표시할 Preference 객체를 제어할 수 있습니다. 설정 화면으로 이동합니다. 예를 들어, 특정 기능이 사용 설정되어 있을 때만 그 기능에 상응하는 Preference가 중요한 경우 그 기능이 사용 중지되면 Preference를 숨기려고 할 수도 있습니다.

조건이 충족될 때만 Preference를 표시하려면 먼저 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에는 선택된 목록 항목이 표시되어야 합니다. 다음 작업도 할 수 있습니다. Preference 객체가 내부 또는 외부 앱 상태(예: 버전을 표시하는 Preference) 있습니다. 이렇게 하려면 SummaryProvider

SimpleSummaryProvider 사용

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

XML에서 이러한 구현을 사용 설정하려면 app:useSimpleSummaryProvider="true"

또는 다음 예와 같이 코드에서 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 예를 보여주는 이미지
그림 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
    }
}

자바

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
}

자바

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를 설정하여 새 Fragment를 실행할 수 있습니다. Activity 또는 Preference를 탭할 때마다 별도의 앱을 만듭니다. 이것은 Kubernetes에서 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)

자바

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

자바

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